# HG changeset patch # User Shinji KONO # Date 1256895716 -32400 # Node ID 4c71ad853125ba1ea505e167309b1372fc381ddd # Parent e112f38275d50ba5e6fcbf5da4ab4e5624e51ccc# Parent 75a0877e962fe796a5c8a4c8112df408e5271044 merge diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/Makefile.def --- a/Renderer/Engine/Makefile.def Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/Makefile.def Fri Oct 30 18:41:56 2009 +0900 @@ -3,7 +3,7 @@ CERIUM = ../.. CC = g++ -CFLAGS = -O9 -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -DDEBUG +CFLAGS = -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -O9 -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I. LIBS = -L$(CERIUM)/TaskManager diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/SceneGraph.cc --- a/Renderer/Engine/SceneGraph.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/SceneGraph.cc Fri Oct 30 18:41:56 2009 +0900 @@ -403,6 +403,7 @@ * image を 32bit(RGBA) に変換する */ SDL_Surface *texture_image = IMG_Load(image_name); + if (!texture_image) return 0; SDL_Surface *tmpImage = SDL_CreateRGBSurface(SDL_HWSURFACE, texture_image->w, texture_image->h, 32, redMask, @@ -477,6 +478,10 @@ if (!texture_hash.hash_regist(filename, tex_id)) { SDL_Surface *texture_image = load_decode_image(image_name, cur); + if (texture_image==0) { + printf("Can't load image %s\n",filename); + exit(0); + } texture_id = makeTapestries(manager, texture_image, tex_id); diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/SceneGraphRoot.cc --- a/Renderer/Engine/SceneGraphRoot.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/SceneGraphRoot.cc Fri Oct 30 18:41:56 2009 +0900 @@ -82,10 +82,10 @@ } if (sg_src_id+1> sg_src_size) { sg_src_size *= 2; - sg_src = (SceneGraphPtr*)realloc(sg_src, sg_src_size); + sg_src = (SceneGraphPtr*)realloc(sg_src, sg_src_size*sizeof(SceneGraphPtr)); } - sg->id = ++sg_src_id; - sg_src[sg->id] = sg; + sg->sgid = ++sg_src_id; + sg_src[sg->sgid] = sg; } void @@ -130,12 +130,39 @@ /* ポリゴン(SceneGraph)生成 */ tmp = new SceneGraph(manager, cur); - registSceneGraph(tmp); } - xmlFreeDoc(doc); +} +void +SceneGraphRoot::createFromXMLmemory(TaskManager *manager, SceneGraph *node, char *data, int len) +{ + xmlDocPtr doc; + xmlNodePtr cur; + + // size は取れるはず、テスト用に mmap したデータを使う + /* パース DOM生成 */ + + doc = xmlParseMemory(data, len); + cur = xmlDocGetRootElement(doc); + + /* ?? */ + xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); + + /* XMLのノードを一つずつ解析 */ + for (cur=cur->children; cur; cur=cur->next) { + /* 扱うのはsurfaceオンリー */ + if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { + continue; + } + /* ポリゴン(SceneGraph)生成 */ + SceneGraphPtr original = new SceneGraph(manager, cur); + registSceneGraph(original); + SceneGraphPtr clone = createSceneGraph(original->sgid); + node->addChild(clone); + } + xmlFreeDoc(doc); } SceneGraphPtr @@ -160,36 +187,6 @@ } -void -SceneGraphRoot::createFromXMLmemory(TaskManager *manager, char *data, int len) -{ - xmlDocPtr doc; - xmlNodePtr cur; - - // size は取れるはず、テスト用に mmap したデータを使う - /* パース DOM生成 */ - - doc = xmlParseMemory(data, len); - cur = xmlDocGetRootElement(doc); - - /* ?? */ - xmlStrcmp(cur->name,(xmlChar*)"OBJECT-3D"); - - /* XMLのノードを一つずつ解析 */ - for (cur=cur->children; cur; cur=cur->next) { - /* 扱うのはsurfaceオンリー */ - if (xmlStrcmp(cur->name,(xmlChar*)"surface") != 0) { - continue; - } - - /* ポリゴン(SceneGraph)生成 */ - SceneGraphPtr tmp = new SceneGraph(manager, cur); - - registSceneGraph(tmp); - } - - xmlFreeDoc(doc); -} SceneGraphPtr @@ -228,7 +225,7 @@ SceneGraphRoot::getLast() { if (sg_src_id>=0) - return sg_src[sg_src_id]->id; + return sg_src[sg_src_id]->sgid; return -1; } diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/SceneGraphRoot.h --- a/Renderer/Engine/SceneGraphRoot.h Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/SceneGraphRoot.h Fri Oct 30 18:41:56 2009 +0900 @@ -59,9 +59,7 @@ */ /* User API */ void createFromXMLfile(TaskManager *manager, const char *); - //void createFromXMLmemory(TaskManager *manager, const char *xml); - //void createFromXMLmemory(TaskManager *manager, st_mmap_t mmap_t); - void createFromXMLmemory(TaskManager *manager, char *data, int len); + void createFromXMLmemory(TaskManager *manager, SceneGraph * node, char *data, int len); SceneGraphPtr createSceneGraph(int id); SceneGraphPtr createSceneGraph(); SceneGraphPtr createSceneGraph(const char *name); diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/spe/Load_Texture.cc --- a/Renderer/Engine/spe/Load_Texture.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/spe/Load_Texture.cc Fri Oct 30 18:41:56 2009 +0900 @@ -5,9 +5,6 @@ #include #include "Load_Texture.h" #include "texture.h" -#if !USE_MEMHASH -#include "TileHash.h" -#endif #include "Func.h" #include "global_alloc.h" diff -r e112f38275d5 -r 4c71ad853125 Renderer/Engine/task/Load_Texture.cc --- a/Renderer/Engine/task/Load_Texture.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Engine/task/Load_Texture.cc Fri Oct 30 18:41:56 2009 +0900 @@ -2,9 +2,6 @@ #include #include "Load_Texture.h" #include "texture.h" -#if !USE_MEMHASH -#include "TileHash.h" -#endif #include "Func.h" #include "global_alloc.h" #include "Tapestry.h" diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/Makefile --- a/Renderer/Test/Makefile Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/Makefile Fri Oct 30 18:41:56 2009 +0900 @@ -1,6 +1,6 @@ -all: cell - #make -f Makefile.macosx +all: + make -f Makefile.macosx cell: make -f Makefile.cell diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/Makefile.def --- a/Renderer/Test/Makefile.def Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/Makefile.def Fri Oct 30 18:41:56 2009 +0900 @@ -2,7 +2,7 @@ CERIUM = ../.. CC = g++ -CFLAGS = -g -Wall -DUSE_MEMLIST=1 -DUSE_MEMHASH=1 # -DDEBUG +CFLAGS = -g -Wall # -O -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I. -I$(CERIUM)/include/Cerium LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/Makefile.macosx --- a/Renderer/Test/Makefile.macosx Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/Makefile.macosx Fri Oct 30 18:41:56 2009 +0900 @@ -2,15 +2,15 @@ LIBS += -lFifoManager -lCerium -CFLAGS += `sdl-config --cflags` `xml2-config --cflags` +CFLAGS += `sdl-config --cflags` `xml2-config --cflags` $(INCLUDE) LIBS += `sdl-config --libs` `xml2-config --libs` -lSDL_image -Wl,-framework,OpenGL .SUFFIXES: .cc .o .xml .xml.h .xml.cc .cc.o: - $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + $(CC) $(CFLAGS) -c $< -o $@ -ALL = ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum send_linda dynamic +ALL = ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum send_linda dynamic writer chain_old all: $(ALL) BALL_BOUND_OBJ = ball_bound.o @@ -61,6 +61,14 @@ send_linda : $(SENDLINDA_OBJ) $(CC) -o $@ $? $(LIBS) +WRITER_OBJ = writer.o +writer : $(WRITER_OBJ) + $(CC) -o $@ $? $(LIBS) + +CHAIN_OBJ = chain_old.o +chain_old : $(CHAIN_OBJ) + $(CC) -o $@ $? $(LIBS) + run: $(TARGET) sudo ./$(TARGET) -width 576 -height 384 -bpp 32 diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/chain_old.cc --- a/Renderer/Test/chain_old.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/chain_old.cc Fri Oct 30 18:41:56 2009 +0900 @@ -1,9 +1,9 @@ #include #include #include "SceneGraphRoot.h" -#include "SGList.h" #include "SceneGraph.h" #include "TaskManager.h" +#include "Chain.h" #include "Func.h" @@ -127,14 +127,14 @@ } MainLoopPtr -chain_old::init(Viewer *sgroot, int w, int h) +Chain::init(Viewer *sgroot, int w, int h) { SceneGraphPtr root_old_chain, chain; CHAIN_VARS rcv; - sgroot->createFromXMLfile(manager,"xml_file/chain.xml"); + sgroot->createFromXMLfile("xml_file/chain.xml"); - root_old_chain = sgroot->createSceneGraph(CHAIN); + root_old_chain = sgroot->createSceneGraph("CHAIN"); root_old_chain->set_move_collision(chain_old_move_ope, chain_old_collision); init_chainold_vars(&rcv); rcv.next_x = w / 2; @@ -142,7 +142,7 @@ set_old_vector(&rcv, root_old_chain); for(int i = 0; i < CHAIN_LEN; i++) { - chain = sgroot->createSceneGraph(CHAIN); + chain = sgroot->createSceneGraph("CHAIN"); chain->id = i; init_chainold_vars(&cv[i]); cv[i].x = 0; @@ -161,7 +161,7 @@ extern Application * application() { - return new ball_bound(); + return new Chain(); } const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/dynamic_create.cc --- a/Renderer/Test/dynamic_create.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/dynamic_create.cc Fri Oct 30 18:41:56 2009 +0900 @@ -48,18 +48,6 @@ void client_list_update(TaskManager *manager, client_t *clist, int id, SceneGraphPtr sgp) { - //client_t *c; - // for (c = clist->next; c != clist; c = c->next) { - // if (c->id == id) { - // c->sgp = sgp; - // return; - // } - // } - - // c->next = (client_t *)manager->allocate(sizeof(client_t)); - // c->next->id = id; - // c->next->sgp = sgp; - // c->next->next = clist; } void @@ -107,30 +95,16 @@ } SceneGraphPtr -create_sg(TaskManager *manager, SceneGraphPtr node, unsigned char *data, int len, int serial_id) +create_sg(TaskManager *manager, SceneGraphPtr parent, unsigned char *data, int len, int serial_id) { - SceneGraphPtr object; - - sgroot->createFromXMLmemory(sgroot->tmanager, (char *)data, len); - object = sgroot->createSceneGraph(sgroot->getLast()); - object->id = serial_id; - object->set_move_collision(moon_move, moon_collision); - node->addChild(object); - - return object; + SceneGraphPtr child = sgroot->createSceneGraph(); + parent->addChild(child); + // 読み込んだオブジェクトは、すべて、child の child になる。 + sgroot->createFromXMLmemory(sgroot->tmanager, child, (char *)data, len); + child->set_move_collision(moon_move, moon_collision); + return child; } -// void -// del_callback(unsigned char *data, void *arg) -// { -// free(data); -// } - -// void -// psx_del(int t, int id) -// { -// psx_callback_in(t, id, del_callback, NULL); -// } static void callback_get_xml(unsigned char *xml_tuple, void *arg) { @@ -139,8 +113,10 @@ unsigned char *xml_data = xml_tuple+LINDA_HEADER_SIZE; SceneGraphPtr sgp; // ここで create - fwrite(xml_data, 1, 10, stdout); + // fwrite(xml_data, 1, 10, stdout); + printf((char *)xml_data); sgp = create_sg(carg->manager, carg->node, xml_data, xml_len, carg->sid); + printf("%s size %d loaded\n", sgp->children->name, xml_len); client_list_update(carg->manager, carg->clist, carg->sid, sgp); free(arg); free(xml_tuple); @@ -157,7 +133,7 @@ data = tuple+LINDA_HEADER_SIZE; // clientのSerialIDを取得 serial_id = ntohl(*(int *)data); - +// serial_id = *(int *)data; printf("serial id = %d\n", serial_id); // タプルを解放 //psx_del(carg->tid, SERIAL_REGIST_TUPLE_NO); diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/send_linda.cc --- a/Renderer/Test/send_linda.cc Fri Oct 30 18:39:12 2009 +0900 +++ b/Renderer/Test/send_linda.cc Fri Oct 30 18:41:56 2009 +0900 @@ -15,32 +15,63 @@ #define PORT_NUM 10000 #define LISTEN_PORT 1 #define MULTI_NUM 10 +#define SEND_DATA_SIZE 24 //sizeof(float) * 6; +void +send_position(SceneGraphPtr node) +{ + char *data; + char send_data[SEND_DATA_SIZE]; // xyz[3] and angle[3] + int tapleid = node->id * 10 + 1; + int fd = *(int*)node->propertyptr; + int seq; + int i; + + for (i = 0; i < 3; i ++) { + ((float *)send_data)[i] = htonl(node->xyz[i]); + ((float *)send_data)[i+3] = htonl(node->angle[i]); + } + seq = psx_in(fd, tapleid); + do { + psx_sync_n(); + data = (char *)psx_reply(seq); + } while (data == NULL); + psx_out(fd, tapleid, (unsigned char *)send_data, SEND_DATA_SIZE); + psx_sync_n(); + psx_free(data); +} void root_move(SceneGraphPtr node, int w, int h) { Pad *pad = sgroot->getController(); - + int flag = 0; if (pad->right.isHold() || pad->left.isHold()) { - if (pad->right.isHold()) { - node->xyz[0] += 5.0f; - } else if (pad->left.isHold()) { - node->xyz[0] -= 5.0f; - } + if (pad->right.isHold()) { + node->xyz[0] += 5.0f; + flag = 1; + } else if (pad->left.isHold()) { + node->xyz[0] -= 5.0f; + flag = 1; + } } if (pad->down.isHold() || pad->up.isHold() ) { - if (pad->down.isHold()) { - node->xyz[1] += 5.0f; - } else if (pad->up.isHold()) { - node->xyz[1] -= 5.0f; - } + if (pad->down.isHold()) { + node->xyz[1] += 5.0f; + flag = 1; + } else if (pad->up.isHold()) { + node->xyz[1] -= 5.0f; + flag = 1; + } } - /* + /* ここでキー入力を向こうに送る - */ - + */ + + if (flag) { + send_position(node); + } } void @@ -65,18 +96,18 @@ struct stat sb; if ((fd = open(filename, O_RDONLY)) == -1) { - fprintf(stderr, "Can't open %s\n", filename); - perror(NULL); + fprintf(stderr, "Can't open %s\n", filename); + perror(NULL); } if (fstat(fd, &sb) == -1) { - fprintf(stderr, "Can't fstat %s\n", filename); - perror(NULL); + fprintf(stderr, "Can't fstat %s\n", filename); + perror(NULL); } *size = sb.st_size; addr = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fd, 0); if (addr == MAP_FAILED) { - perror("mmap error\n"); - exit(EXIT_FAILURE); + perror("mmap error\n"); + exit(EXIT_FAILURE); } close(fd); @@ -91,8 +122,10 @@ int seq; seq = psx_in(fd, 65535); - psx_sync_n(); - data = (char *)psx_reply(seq); + do { + psx_sync_n(); + data = (char *)psx_reply(seq); + } while (data == 0); serial = atoi(data + LINDA_HEADER_SIZE); psx_free(data); @@ -136,7 +169,7 @@ static char *linda = HOSTNAME; MainLoopPtr -send_linda::init(Viewer *sgroot, int screen_w, int screen_h) +send_linda::init(Viewer *sgr, int screen_w, int screen_h) { void *addr; int size; @@ -146,28 +179,40 @@ SceneGraphPtr sgp; SceneGraphPtr root; + root = sgroot->createSceneGraph(); root->set_move_collision(root_move, root_collision); - - // createFromXMLfile で object name のリストを生成して返したい - sgroot->createFromXMLfile( xml); - // 今だけは決め打ち、本当はリストを回して object 数 create したい - sgp = sgroot->createSceneGraph("Ball"); + + addr = file_map(xml, &size); + sgp = sgroot->createSceneGraph(); + sgroot->createFromXMLmemory(sgroot->tmanager, sgp, (char *)addr, size); sgp->set_move_collision(move, collision); root->addChild(sgp); - - addr = file_map(xml, &size); - tspace = open_linda_java(linda, PORT_NUM); + + tspace = open_linda_java(linda, PORT_NUM); + root->propertyptr = sgroot->tmanager->allocate(sizeof(int)); + root->property_size = sizeof(int); + *(int *)root->propertyptr = tspace; + serial = get_serial_id(tspace); + root->id = serial; xml_id = serial * 10; - send_xml(tspace, xml_id, addr, size); - - int client_id = htonl(serial); - send_xml(tspace, LISTEN_PORT, (void *)client_id, sizeof(int)); + send_xml(tspace, xml_id, addr, size); + int client_id = htonl(serial); + printf("serial id = %d\n", client_id); + send_xml(tspace, LISTEN_PORT, (unsigned char *)&client_id, sizeof(int)); + + int pos_id = serial * 10 + 1; + char pos_data[SEND_DATA_SIZE]; + for (int i = 0; i < 6; i++) { + ((float *)pos_data)[i] = htonl(0.0f); + } + send_xml(tspace, pos_id, (unsigned char *)pos_data, SEND_DATA_SIZE); + sgroot->setSceneData(root); - return sgroot; + return sgr; } extern Application * @@ -189,11 +234,11 @@ manager->set_TMend(TMend); for(int i=0;i +#include +#include +#include +#include +#include +#include + +#include "lindaapi.h" + +#define PORT 10000 + +#define SERIAL_REGIST_TUPLE_NO 1 + +void +mainLoop(int tid, int write_id, int fd) +{ + void *addr; + struct stat sb; + + if (fstat(fd, &sb) == -1) { + perror("fstat"); + exit(1); + } + addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (addr==NULL) { + perror("mmap"); + exit(1); + } + + printf("file size=%lld\n", sb.st_size); + + psx_out(tid, write_id, (unsigned char *)addr, sb.st_size); + psx_sync_n(); + + return; +} + +int get_serial_id(int tid) { + char *data; + int serial; + int seq; + + seq = psx_in(tid, 65535); + do { + psx_sync_n(); + data = (char *)psx_reply(seq); + } while(data==0); + serial = atoi(data + LINDA_HEADER_SIZE); + psx_free(data); + + return serial; +} + +void send_serial_id(int tid, int serial_id) { + int safe_id = htonl(serial_id); + + psx_out(tid, SERIAL_REGIST_TUPLE_NO, (unsigned char *)&safe_id, sizeof(safe_id)); + psx_sync_n(); +} + +int +main(int argc, char *argv[]) { + int tspace; + int serial; + int xml_id; + char *linda_serv = "localhost"; + if (argc > 1) + linda_serv = argv[1]; + init_linda(); + tspace = open_linda_java(linda_serv, PORT); + printf("open socket (tupple space id) = %d\n", tspace); + serial = get_serial_id(tspace); + xml_id = serial * 10; + mainLoop(tspace, xml_id, fileno(stdin)); + sleep(1); + send_serial_id(tspace, serial); + printf("send xml_id = %d, seciral = %d\n",xml_id, serial); + exit(EXIT_SUCCESS); +} + +/* end */ diff -r e112f38275d5 -r 4c71ad853125 Renderer/Test/xml_file/cube_split.xml --- a/Renderer/Test/xml_file/cube_split.xml Fri Oct 30 18:39:12 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,279 +0,0 @@ - - - - - 38.655231 38.973322 -1.031601 - -42.648190 38.973337 -1.031601 - -42.648209 -42.330103 -1.031601 - -42.648209 -42.330103 -1.031601 - 38.655231 -42.330107 -1.031601 - 38.655231 38.973322 -1.031601 - - - 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.996483 -1.678389 -1.031601 - - - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - - - iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK - TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ - WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec - 5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A - AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0 - ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO - WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi - wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM - AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l - YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi - NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA - QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c - wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie - whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c - QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO - Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM - WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh - JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU - Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p - dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y - b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O - UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb - di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W - 7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83 - MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr - PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW - 2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1 - U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd - 8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0 - 8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H - vqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsG - Lww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjg - 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 - rkJggg== - - - - - 1.789587 1.361652 11.458147 - 1.789587 -1.898860 11.458147 - -1.470925 -1.898860 11.458147 - -1.470925 -1.898860 11.458147 - -1.470925 1.361653 11.458147 - 1.789587 1.361652 11.458147 - 1.789588 1.361652 14.718660 - -1.470925 1.361652 14.718660 - -1.470926 -1.898860 14.718660 - -1.470926 -1.898860 14.718660 - 1.789587 -1.898861 14.718660 - 1.789588 1.361652 14.718660 - 1.789587 1.361652 11.458147 - 1.789588 1.361652 14.718660 - 1.789587 -1.898861 14.718660 - 1.789587 -1.898861 14.718660 - 1.789587 -1.898860 11.458147 - 1.789587 1.361652 11.458147 - 1.789587 -1.898860 11.458147 - 1.789587 -1.898861 14.718660 - -1.470926 -1.898860 14.718660 - -1.470926 -1.898860 14.718660 - -1.470925 -1.898860 11.458147 - 1.789587 -1.898860 11.458147 - -1.470925 -1.898860 11.458147 - -1.470926 -1.898860 14.718660 - -1.470925 1.361652 14.718660 - -1.470925 1.361652 14.718660 - -1.470925 1.361653 11.458147 - -1.470925 -1.898860 11.458147 - 1.789588 1.361652 14.718660 - 1.789587 1.361652 11.458147 - -1.470925 1.361653 11.458147 - -1.470925 1.361653 11.458147 - -1.470925 1.361652 14.718660 - 1.789588 1.361652 14.718660 - - - 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 - 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.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 - -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.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.159331 -0.268604 13.088404 - - - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - 0.000000 0.000000 - 1.000000 0.000000 - 1.000000 1.000000 - 1.000000 1.000000 - 0.000000 1.000000 - 0.000000 0.000000 - - - iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK - TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ - WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec - 5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A - AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0 - ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO - WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi - wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM - AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l - YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi - NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA - QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c - wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie - whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c - QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO - Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM - WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh - JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU - Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p - dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y - b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O - UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb - di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W - 7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83 - MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr - PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW - 2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1 - U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd - 8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0 - 8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H - vqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsG - Lww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjg - 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 - rkJggg== - - -