globs-0.2.0~svn50/0000775000175000017500000000000011516033442013204 5ustar takakitakakiglobs-0.2.0~svn50/SConstruct0000664000175000017500000000073511516033401015236 0ustar takakitakakiimport os # Install directories root = ARGUMENTS.get('root', '/') prefix = ARGUMENTS.get('prefix', 'usr/local') if root != '' and prefix != '': # not defaults if prefix[0] == '/': prefix = prefix[1:] install_dir = os.path.join(root, prefix, 'share/globs/benchmarks') locale_dir = os.path.join(root, prefix, 'share/locale') # run sub scripts Export('install_dir', 'locale_dir') dirs = ('src/benchmarks', 'po') for x in dirs: SConscript(os.path.join(x, 'SConstruct')) globs-0.2.0~svn50/README0000664000175000017500000000240011516033401014053 0ustar takakitakakiglobs: GL Open Benchmark Suite Copyright (C) 2006-2007 Angelo "Encelo" Theodorou http://globs.sourceforge.net Info ---- GL O.B.S. is a framework for OpenGL benchmarks. It's based upon a program that interacts with the user through a gui and a series of benchmarks which share a common options set and shell output format. Dependencies ------------ SCons (Building) Python >= 2.6 (Program) GTK2 >= 2.16, PyGTK, Libglade (GUI) SQLite3 (Offline DB) OpenGL headers and libraries, SDL, SDL_image (Benchmarks) Please note that, even if using GtkBuilder, at the moment libglade is still needed for correct localization of the GUI. OPTIONAL: MatPlotLib, NumPy (Statistical charts) Epydoc (Docs generation) Compiling --------- To compile benchmarks, type: $ scons Using ----- To run the program without installing it, type: $ ./launch.sh Installation ------------ To install the program, type: $ scons install [ root=path prefix=path ] $ python patchdir.py [ prefix=path ] $ python setup.py install [ --root=path --prefix=path ] You can specify a prefix (e.g. /usr) and an alternative root (e.g. /mnt/hdb1). Generating Docs --------------- Go in the src directory then type: $ epydoc -o epydoc --name=globs --url=http://globs.sourceforge.net --graph=all Globs/*.py globs-0.2.0~svn50/COPYING0000664000175000017500000004310311516033401014233 0ustar takakitakaki GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. globs-0.2.0~svn50/launch.sh0000775000175000017500000000007011516033401015005 0ustar takakitakaki#!/bin/sh cd `dirname $0`/src exec python -OOt globs $@ globs-0.2.0~svn50/globs.desktop0000664000175000017500000000026011516033401015676 0ustar takakitakaki[Desktop Entry] Name=Globs Comment=GL Open Benchmark Suite Icon=globs.png Exec=globs %F Terminal=false Type=Application Encoding=UTF-8 Categories=Application;System;Benchmark; globs-0.2.0~svn50/src/0000775000175000017500000000000011516033442013773 5ustar takakitakakiglobs-0.2.0~svn50/src/Globs/0000775000175000017500000000000011516033442015041 5ustar takakitakakiglobs-0.2.0~svn50/src/Globs/local_db_win.py0000664000175000017500000001716111516033401020030 0ustar takakitakaki## local_db_win.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import pygtk pygtk.require('2.0') import gtk class Local_DB_Window: """Open the local database window""" def __init__(self, ui_file, db_cls, bm_cls, user_cls, sub_cls): # Saving instances of "singleton" classes self.db = db_cls self.bm = bm_cls self.user = user_cls self.submit = sub_cls self.ui = gtk.Builder() self.ui.add_from_file(ui_file) app_signals = { "on_submit_entry_button_clicked": self.on_submit_entry_button_clicked, "on_delete_entry_button_clicked": self.on_delete_entry_button_clicked, "on_refresh_button_clicked": self.on_refresh_button_clicked, "on_close_button_clicked": self.on_close_button_clicked } self.ui.connect_signals(app_signals) # Getting widgets self.window = self.ui.get_object("local_db_win") self.bench_list = self.ui.get_object("bench_list") self.close_button = self.ui.get_object("close_button") # Init methods self.setup_bench_list() self.populate_bench_list() def setup_bench_list(self): """Setup the treeview for benchmarks list""" cell = gtk.CellRendererText() # Columns column = gtk.TreeViewColumn(_('Name')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 0) column.set_resizable(True) column.set_sort_column_id(0) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Version')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 1) column.set_resizable(True) column.set_sort_column_id(1) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('FPS')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 2) column.set_resizable(True) column.set_sort_column_id(2) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Width')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 3) column.set_resizable(True) column.set_sort_column_id(3) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Height')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 4) column.set_resizable(True) column.set_sort_column_id(4) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Fullscreen')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 5) column.set_resizable(True) column.set_sort_column_id(5) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Time')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 6) column.set_resizable(True) column.set_sort_column_id(6) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Date')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 7) column.set_resizable(True) column.set_sort_column_id(7) self.bench_list.append_column(column) # Model self.liststore = gtk.ListStore(str, str, float, int, int, str, int, str) self.bench_list.set_model(self.liststore) # Selection Mode selection = self.bench_list.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) def populate_bench_list(self): """Populate the treeview with benchmarks""" rows = self.db.select() for row in rows: self.liststore.append(row) def update_bench_list(self): """Update the benchmarks treeview""" self.liststore.clear() self.populate_bench_list() # Callbacks def on_submit_entry_button_clicked(self, event): """Submit selected entries to the common online database""" if self.user['user'] == None or self.user['password'] == None: dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format=_('You should provide a user name and a password in the User tab of the Preferences window!')) dlg.set_default_response(gtk.RESPONSE_CLOSE) response = dlg.run() dlg.destroy() return selection = self.bench_list.get_selection() (model, paths) = selection.get_selected_rows() if len(paths) == 0: return elif len(paths) > 1: # multi-selection dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=_('Do you really want to submit the selected entries?')) dlg.set_default_response(gtk.RESPONSE_YES) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: return message = '' for path in paths: iter = model.get_iter(path) name = model.get_value(iter, 0) date = model.get_value(iter, 7) response = self.submit.send(date) if response[0] == False: # Benchmark neither inserted nor updated dialog_type = gtk.MESSAGE_ERROR if response[1] == self.submit.PARSE_ERROR_CONN: message = _('Error in the connection!') break elif response[1] == self.submit.PARSE_ERROR_URL: message = _('Malformed URL sent!') break elif response[1] == self.submit.PARSE_ERROR_DB_CONN: message = _('Cannot connect to the remote database!') break elif response[1] == self.submit.PARSE_ERROR_DB_SEL: message = _('The remote database cannot be selected!') break elif response[1] == self.submit.PARSE_ERROR_PASSWORD: message = _('Wrong password!') break elif response[1] == self.submit.PARSE_NOTHING: dialog_type = gtk.MESSAGE_INFO message += _(name + ' not updated\n') else: # benchmark either inserted or updated dialog_type = gtk.MESSAGE_INFO if response[1] == self.submit.PARSE_UPDATED: message += _(name + ' updated\n') elif response[1] == self.submit.PARSE_INSERTED: message += _(name + ' inserted\n') elif response[1] == self.submit.PARSE_INSERTED_NM: message = _('New machine inserted\n') message += _(name + ' inserted\n') elif response[1] == self.submit.PARSE_INSERTED_NUNM: message = _('New user and new machine inserted\n') message += _(name + ' inserted\n') dlg = gtk.MessageDialog(type=dialog_type, buttons=gtk.BUTTONS_CLOSE, message_format=message) dlg.set_default_response(gtk.RESPONSE_CLOSE) dlg.run() dlg.destroy() def on_delete_entry_button_clicked(self, event): """Delete selected entries from the database""" selection = self.bench_list.get_selection() (model, paths) = selection.get_selected_rows() if len(paths) == 0: return elif len(paths) > 1: # multi-selection dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=_('Do you really want to delete the selected entries?')) dlg.set_default_response(gtk.RESPONSE_YES) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: return paths.reverse() # Removing iters in reverse order for path in paths: iter = model.get_iter(path) date = model.get_value(iter, 7) self.db.remove(date) model.remove(iter) def on_refresh_button_clicked(self, event): """Refresh entries listing""" self.update_bench_list() def on_close_button_clicked(self, event): """Close the local database window""" self.window.destroy() globs-0.2.0~svn50/src/Globs/statistics.py0000664000175000017500000001364411516033401017610 0ustar takakitakaki## statistics.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import array as a try: import numpy as n except ImportError: with_numpy = False # NumPy is not installed! else: with_numpy = True class Statistics_Numpy: """Statistics class, Numpy version""" def __init__(self, names): self.chunk = 100 # Preallocation chunk size self.__arrays = {} self.__sizes = {} self.__max = {} self.__min = {} for name in names: self.__arrays[name] = n.array(n.zeros(self.chunk)) self.__sizes[name] = 0 self.__max[name] = None self.__min[name] = None def __getitem__(self, key): """Return the results array of the selected benchmark""" try: size = self.__sizes[key] array = self.__arrays[key][:size] return array except KeyError: return None def __len__(self): """Return the number of available benchmarks arrays""" return len(self.__arrays) def append(self, value, name): """Append a value in the selected array""" if name not in self.__arrays: print(name + " " + _("doesn't exist!")) return None size = self.__sizes[name] array = self.__arrays[name] if size == len(array): self.__arrays[name] = n.concatenate([array, n.zeros(self.chunk)]) self.__arrays[name][size] = value self.__sizes[name] += 1 if value > self.__max[name] or self.__max[name] == None: self.__max[name] = value if value < self.__min[name] or self.__min[name] == None: self.__min[name] = value def clear(self, name): """Erase the selected array""" try: self.__arrays[name] = n.array(n.zeros(self.chunk)) self.__sizes[name] = 0 self.__max[name] = None self.__min[name] = None except KeyError: print(name + " " + _("doesn't exist!")) def get_array(self, name, tail=0): """Return the selected array, optionally just a tail of it""" if name not in self.__arrays: return None size = self.__sizes[name] array = self.__arrays[name][:size] if slice == 0: return array else: return array[-tail:] def get_last(self, name): """Return the last value in the selected array It is similar (but not the same!) to get_array(name, slice=1)""" if name not in self.__arrays: return None size = self.__sizes[name] array = self.__arrays[name][:size] if size == 0: # Empty array return None else: return array[len(array)-1] def get_min(self, name): """Return the minimum value in the selected array""" try: return self.__min[name] except KeyError: return None def get_max(self, name): """Return the maximum value in the selected array""" try: return self.__max[name] except KeyError: return None def get_avg(self, name): """Return the average value in the selected array""" try: size = self.__sizes[name] array = self.__arrays[name][:size] return n.sum(array)/size except ZeroDivisionError: return 0 except KeyError: return None class Statistics_Array: """Statistics class, built-in array module version""" def __init__(self, names): self.__arrays = {} self.__min = {} self.__max = {} for name in names: self.__arrays[name] = a.array('f') self.__max[name] = None self.__min[name] = None def __getitem__(self, key): """Return the results array of the selected benchmark""" try: return self.__arrays[key].tolist() except KeyError: return None def __len__(self): """Return the number of available benchmarks arrays""" return len(self.__arrays) def append(self, value, name): """Append a value in the selected array""" try: self.__arrays[name].append(value) if value > self.__max[name] or self.__max[name] == None: self.__max[name] = value if value < self.__min[name] or self.__min[name] == None: self.__min[name] = value except KeyError: print(name + " " + _("doesn't exist!")) return None def clear(self, name): """Erase the selected array""" try: del self.__arrays[name][:] self.__max[name] = None self.__min[name] = None except KeyError: print(name + " " + _("doesn't exist!")) def get_array(self, name, tail=0): """Return the selected array, optionally just a tail of it""" if name not in self.__arrays: return None array = self.__arrays[name] if tail == 0: return array.tolist() else: return array[-tail:].tolist() def get_last(self, name): """Return the last value in the selected array It is similar (but not the same!) to get_array(name, slice=1)""" if name not in self.__arrays: return None array = self.__arrays[name] try: return array[len(array)-1] except IndexError: # Empty array return None def get_min(self, name): """Return the minimum value in the selected array""" try: return self.__min[name] except KeyError: return None def get_max(self, name): """Return the maximum value in the selected array""" try: return self.__max[name] except KeyError: return None def get_avg(self, name): """Return the average value in the selected array""" if name not in self.__arrays: return None array = self.__arrays[name] try: avg = sum(array) / len(array) except ZeroDivisionError: avg = 0 return avg if with_numpy == True: Statistics = Statistics_Numpy else: Statistics = Statistics_Array globs-0.2.0~svn50/src/Globs/about_dlg.py0000664000175000017500000000262011516033401017346 0ustar takakitakaki## about_dlg.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import sys import pygtk pygtk.require('2.0') import gtk import webbrowser import Globs class About_Dialog: """Open the about dialog""" def __init__(self, ui_file): gtk.about_dialog_set_url_hook(self.__url_hook) self.ui = gtk.Builder() self.ui.add_from_file(ui_file) self.dialog = self.ui.get_object("about_dlg") self.dialog.set_version(Globs.VERSION) self.dialog.run() self.dialog.destroy() return def __url_hook(dialog, link, user_data): """Hook function called when a link in the about dialog is clicked""" webbrowser.open_new_tab(user_data) globs-0.2.0~svn50/src/Globs/stats_area.py0000664000175000017500000001235611516033401017543 0ustar takakitakaki## stats_area.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## try: import matplotlib.figure as f import matplotlib.pylab as p import numpy as n from matplotlib.backends.backend_gtkcairo import FigureCanvasGTKCairo as FigureCanvas except ImportError: with_matplotlib = False # Matplotlib and NumPy are not installed! import gtk else: with_matplotlib = True class Statistics_Area_Chart: """Statistics Drawing Area class, Chart version""" def __init__(self, statistics): self.stats = statistics def setup(self, parent_box): """Setup the Drawing Area class for the bar chart""" self.parent = parent_box self.idx = 5 # Show only the last idx results self.fig = f.Figure(figsize=(5,4), dpi=100, facecolor='w', edgecolor='k') self.fig.hold(False) self.axes = self.fig.add_subplot(111) self.axes.grid(True) self.axes.set_xlim(0, self.idx + 4) # Last idx elements plus empty, max, min and avg self.axes.set_xticklabels([], fontsize=8) self.axes.set_yticklabels([], fontsize=8) self.canvas = FigureCanvas(self.fig) # a gtk.DrawingArea self.parent.pack_start(self.canvas, True, True) self.canvas.show() def update(self, name): """Update the bar chart with the last collected data""" idx = self.idx height = self.stats.get_array(name, idx) labels = [] for h in height: labels.append(str(h)) sz = len(height) last = self.stats.get_last(name) max = self.stats.get_max(name) avg = self.stats.get_avg(name) min = self.stats.get_min(name) self.axes.clear() self.axes.grid(True) if sz >= 1: # There's at least one result if sz >= 2: # There're at least two results self.axes.bar(n.arange(0.1, sz-1), height[:-1], xerr = n.arange(0.1, sz-1), yerr = n.zeros(sz-1), color='b') # Previous history self.axes.bar(0.1 + sz - 1, last, xerr=0.1 + sz - 1, yerr=0, color='c') # Last self.axes.bar(idx + 1 + 0.1, max, xerr=idx + 0.1, yerr=0, color='g') # Max self.axes.bar(idx + 2 + 0.1, avg, xerr=idx + 1 + 0.1, yerr=0, color='y') # Avg self.axes.bar(idx + 3 + 0.1, min, xerr=idx + 2 + 0.1, yerr=0, color='r') # Min self.axes.set_xlim(0, idx + 4) # Last idx elements plus empty, max, min and avg self.axes.set_xticks(n.concatenate((n.arange(0.1 + 0.4, sz), n.arange(idx + 1 + 0.1 + 0.4, idx + 4)))) self.axes.set_xticklabels(labels + [str(max), str(avg), str(min)], fontsize=8) else: # Empty chart self.axes.set_xlim(0, idx + 4) # Last idx elements plus max, min and avg self.axes.set_xticklabels([]) self.axes.set_yticklabels([]) self.canvas.draw() class Statistics_Area_Simple: """Statistics Drawing Area class, Simple version""" def __init__(self, statistics): self.stats = statistics def setup(self, parent_box): """Setup the progress bars for *poor man* charts""" self.parent = parent_box hbox = gtk.HBox(False, 0) vbox_r = gtk.VBox(True, 0) vbox_l = gtk.VBox(True, 0) hbox.pack_start(vbox_r, False, True, 0) hbox.pack_start(vbox_l, True, True, 0) lab1 = gtk.Label(_('Best FPS:')) lab2 = gtk.Label(_('Last FPS:')) lab3 = gtk.Label(_('Worst FPS:')) vbox_r.pack_start(lab1, False, False, 0) vbox_r.pack_start(lab2, False, False, 0) vbox_r.pack_start(lab3, False, False, 0) self.best_bar = gtk.ProgressBar() self.best_bar.set_text(_('N/A')) self.best_bar.set_fraction(0.0) self.last_bar = gtk.ProgressBar() self.last_bar.set_text(_('N/A')) self.last_bar.set_fraction(0.0) self.worst_bar = gtk.ProgressBar() self.worst_bar.set_text(_('N/A')) self.worst_bar.set_fraction(0.0) vbox_l.pack_start(self.best_bar, False, False, 0) vbox_l.pack_start(self.last_bar, False, False, 0) vbox_l.pack_start(self.worst_bar, False, False, 0) self.parent.pack_start(hbox) hbox.show_all() def update(self, name): """Update the progress bars with the last collected data""" max = self.stats.get_max(name) last = self.stats.get_last(name) min = self.stats.get_min(name) if max != None: self.best_bar.set_text(str(max)) self.best_bar.set_fraction(1.0) else: self.best_bar.set_text(_('N/A')) self.best_bar.set_fraction(0.0) if last != None: self.last_bar.set_text(str(last)) self.last_bar.set_fraction(last/max) else: self.last_bar.set_text(_('N/A')) self.last_bar.set_fraction(0.0) if min != None: self.worst_bar.set_text(str(min)) self.worst_bar.set_fraction(min/max) else: self.worst_bar.set_text(_('N/A')) self.worst_bar.set_fraction(0.0) if with_matplotlib == True: Statistics_Area = Statistics_Area_Chart else: Statistics_Area = Statistics_Area_Simple globs-0.2.0~svn50/src/Globs/user.py0000664000175000017500000000503411516033401016366 0ustar takakitakaki## user.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os from hashlib import md5 from db import Database class User(Database): """User information managing class""" def __init__(self, fname): """Connect and try to create the user table""" Database.__init__(self, fname) self.table = 'user' try: self.create_table() except self.error: print(_('User table exists already')) def __getitem__(self, key): """Return data from the selected row of the user table""" SELECT = """SELECT %s FROM user;""" % key try: self.cur.execute(SELECT) except self.error: return None fetch = self.cur.fetchall() if len(fetch) > 0: return fetch[0][0] else: return None def create_table(self): """Create the user table""" CREATE = """CREATE TABLE user ( user VARCHAR(128) NOT NULL, password CHAR(32) NOT NULL, name VARCHAR(128), location VARCHAR(128), email VARCHAR(128), homesite VARCHAR(128), PRIMARY KEY(user) );""" self.cur.execute(CREATE) self.con.commit() def update(self, data, is_md5 = False): """Update user information""" if data['user'] == None or data['password'] == None\ or data['user'] == '' or data['password'] == '': print(_('No value provided for user name or password!')) return # The password in data dictionary needs hashing if is_md5 == False: data['password'] = md5.md5(data['password']).hexdigest() DELETE = """DELETE FROM user;""" INSERT = """INSERT INTO user VALUES ('%s', '%s', '%s', '%s', '%s', '%s')""" % \ (data['user'], data['password'], data['name'], data['location'], data['email'], data['homesite']) # There is only one row for the user, so first deleting then inserting self.cur.execute(DELETE) self.cur.execute(INSERT) self.con.commit() globs-0.2.0~svn50/src/Globs/local_db.py0000664000175000017500000001013011516033401017140 0ustar takakitakaki## local_db.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os from db import Database class Local_Database(Database): """Internal benchmarks database managing class""" def __init__(self, fname): """Connect and try to create the benchmark table""" Database.__init__(self, fname) self.table = 'benchmarks' try: self.create_table() except self.error: print(_('Benchmarks table exists already')) def create_table(self): """Create the benchmark table""" CREATE = """CREATE TABLE benchmarks ( name VARCHAR(128) NOT NULL, version VARCHAR(128) NOT NULL, fps FLOAT NOT NULL, width INTEGER, height INTEGER, fullscreen BOOLEAN, time INTEGER, date TIMESTAMP NOT NULL, PRIMARY KEY(date) );""" self.cur.execute(CREATE) self.con.commit() def delete(self, bench_name): """Delete a row in the benchmark table""" DELETE = """DELETE FROM benchmarks WHERE name='%s';""" % bench_name self.cur.execute(DELETE) self.con.commit() def insert(self, info, opts, fps): """Insert a row in the benchmark table if the new fps result is better than the one which is currently stored""" DATETIME = """SELECT DATETIME('NOW', 'LOCALTIME');""" self.cur.execute(DATETIME) fetch = self.cur.fetchall() now = fetch[0][0] INSERT = """INSERT INTO benchmarks VALUES ('%s', '%s', %s, %s, %s, '%s', %s, '%s');""" % (info['name'], info['version'], fps, opts['width'], opts['height'], opts['fullscreen'], opts['time'], now) UPDATE = """UPDATE benchmarks SET version='%s', fps=%s, time=%s, date='%s' """ % (info['version'], fps, opts['time'], now) CONDITION_MIN = """WHERE name='%s' AND width='%s' AND height='%s' AND fullscreen='%s' AND time<='%s' AND fps<'%s';""" % (info['name'], opts['width'], opts['height'], opts['fullscreen'], opts['time'], fps) CONDITION_MAJ = """WHERE name='%s' AND width='%s' AND height='%s' AND fullscreen='%s' AND time<='%s' AND fps>='%s';""" % (info['name'], opts['width'], opts['height'], opts['fullscreen'], opts['time'], fps) COUNT_MAJ = """SELECT COUNT(*) FROM benchmarks """ + CONDITION_MAJ COUNT_MIN = """SELECT COUNT(*) FROM benchmarks """ + CONDITION_MIN self.cur.execute(COUNT_MIN) fetch = self.cur.fetchall() counter_min = fetch[0][0] self.cur.execute(COUNT_MAJ) fetch = self.cur.fetchall() counter_maj = fetch[0][0] if counter_min != 0: # There are worse results needed to be upgraded update = True; else: update = False; modified = False # INSERT if ((update == False and counter_maj == 0) or (counter_min == 0 and counter_maj == 0)): # update condition false, but because there self.cur.execute(INSERT) modified = True elif update == True: self.cur.execute(UPDATE + CONDITION_MIN) modified = True self.con.commit() if modified: return now else: return None def remove(self, date): """Remove the benchmark executed on 'date' from the database""" DELETE = """DELETE FROM benchmarks WHERE date='%s'""" % date self.cur.execute(DELETE) self.con.commit() def purge(self, bench_names): """Delete rows which are NOT in the bench_names tuple""" DELETE = """DELETE FROM benchmarks WHERE name not in %s;""" % str(bench_names) # Convert a string rep of a list in a string rep of a tuple DELETE = DELETE.replace('[', '(') DELETE = DELETE.replace(']', ')') self.cur.execute(DELETE) self.con.commit() globs-0.2.0~svn50/src/Globs/__init__.py0000664000175000017500000000030111516033401017137 0ustar takakitakakiVERSION = '0.2-svn' SUBMIT_URL = 'http://globs.sourceforge.net/db_submit.php' HELP_URL = 'http://globs.sourceforge.net/documentation.php' BROWSE_URL = 'http://globs.sourceforge.net/browse.php' globs-0.2.0~svn50/src/Globs/benchmarks.py0000664000175000017500000001356611516033401017536 0ustar takakitakaki## benchmarks.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os from subprocess import Popen, PIPE import json #Python >= 2.6 class Benchmarks: """ This class parses every info_file inside the benchdir, then fills dictionaries with options and information about the available benchmarks. """ def __init__(self, benchdir = 'benchmarks', info_file='globs_info.json'): self.__infos = self.gather_info(benchdir, info_file) self.__names = self.build_names() self.__options = {} def __getitem__(self, key): """Return the info dictionary of the selected benchmark""" try: return self.__infos[key] except KeyError: return None def __len__(self): """Return the number of available benchmarks""" return len(self.__infos) def gather_info(self, benchdir, infofile): """Return a list with all the information collected from available benchmarks""" infos = {} execdict = {} try: benchdir_list = os.listdir(benchdir) except OSError: return infos for bench in benchdir_list: benchpath = os.path.join(benchdir, bench) if os.path.isdir(benchpath): file_list = os.listdir(benchpath) for f in file_list: if f == infofile: execdict.clear() info_file = os.path.join(benchpath, f) info_dicts = json.load(open(info_file)) for k in info_dicts: info_dicts[k]['directory'] = benchpath infos[info_dicts[k]['name']] = info_dicts[k] return infos def build_names(self): """Return a tuple of benchmark names""" names = list(self.__infos.keys()) return names def exec_str(self, name): """Return the string for benchmark invokation""" if name not in self.__infos: print(name + " " + _("doesn't exist!")) return None else: info = self.__infos[name] return 'cd ' + info['directory'] + ' && ./' + info['file'] def opts_str(self, name=None, opts=None): """Return the string to append for options setting""" if name == None and opts == None: print(_('opts_str() needs at least one argument!')) if name != None and name not in self.__infos: print(name + " " + _("doesn't exist!")) return None if opts == None: info = self.__infos[name] opts = info['defaults'] if opts['fullscreen'] == True: fs = '-f ' else: fs = '' return fs + '-w' + str(opts['width']) + ' -h' + str(opts['height']) + ' -t' + str(opts['time']) def check_ver(self, name, ver_str): """Check if the required OpenGL version is available for the selected benchmark""" if name not in self.__infos: print(name + " " + _("doesn't exist!")) return None if 'gl_version' in self.__infos[name] and ver_str != None: bench_ver = self.__infos[name]['glversion'] major = int(ver_str.split(' ')[0].split('.')[0]) minor = int(ver_str.split(' ')[0].split('.')[1]) bench_major = int(bench_ver.split('.')[0]) if len(bench_ver.split('.')) > 1: bench_minor = int(bench_ver.split('.')[1]) else: bench_minor = 0 if major > bench_major: return True elif major < bench_major: return False else: if minor >= bench_minor: return True else: return False return True def check_ext(self, name, hwd_ext): """Check if the required OpenGL extensions are available for the selected benchmark""" if name not in self.__infos: print(name + " " + _("doesn't exist!")) return None if 'extensions' in self.__infos[name] and hwd_ext != None and len(hwd_ext) != 0: bench_ext = self.__infos[name]['extensions'] missing_ext = [] for ext in bench_ext: if ext not in hwd_ext: missing_ext.append(ext) if len(missing_ext) != 0: for ext in missing_ext: print(_("OpenGL extension %s is missing!") % ext) return missing_ext else: return True def run(self, name, opts=None): """Run the selected benchmark and return FPS""" if name not in self.__infos: print(name + " " + _("doesn't exist!")) return None exec_string = self.exec_str(name) opts_string = self.opts_str(name, opts) # Creating the current options dictionary if opts == None: self.__options[name] = (self.__infos[name])['defaults'] else: self.__options[name] = opts pipe = Popen(exec_string + ' ' + opts_string, shell=True, stdout=PIPE).stdout output = pipe.readlines() pipe.close() fps = None # Parsing returned data for x in output: x = x.replace(' ', '') # stripping spaces x = x.replace('\n', '') # stripping newline splitted = x.split('=') if splitted[0] == 'fps': fps = float(splitted[1]) return fps # Couldn't parse correctly the output else: if len(output): print(_("Could not parse benchmark output") + ':') for line in output: print(" " + line, ) return None def get_info(self, name): """Return the info dictionary of the selected benchmark""" if name not in self.__infos: print(name + " " + _("doesn't exist!")) return None else: return self.__infos[name] def get_names(self): """Return the names tuple""" return self.__names def get_options(self, name): """Return the options dictionary of the selected benchmark""" if name not in self.__options: return None else: return self.__options[name] globs-0.2.0~svn50/src/Globs/db.py0000664000175000017500000000507511516033401016002 0ustar takakitakaki## db.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import sys import os import datetime from sqlite3 import dbapi2 as sqlite class Database: """General database managing class""" def __init__(self, fname): """Connect to the specified database""" self.error = sqlite.Error if os.path.exists(fname) == False: print(_('Creating') + ' ' + fname) self.con = sqlite.connect(fname) self.cur = self.con.cursor() self.table = None def __del__(self): """Close the connection""" self.con.commit() self.con.close() def clear(self): """Clear the whole specified table""" DELETE = """DELETE FROM %s;""" % self.table self.cur.execute(DELETE) self.con.commit() def drop_table(self): """Drop the specified table""" DROP = """DROP TABLE %s;""" % self.table self.cur.execute(DROP) self.con.commit() def query(self, string): """Execute an arbitrary query""" self.cur.execute(string) return self.cur.fetchall() def select(self, where=''): """Return the rows selected by a WHERE clause""" SELECT = """SELECT * FROM %s %s;""" % (self.table, where) self.cur.execute(SELECT) return self.cur.fetchall() def show(self, where=''): """Print the rows selected by a WHERE clause""" SELECT = """SELECT * FROM %s %s;""" % (self.table, where) self.cur.execute(SELECT) for row in self.cur: line = '' for i in range(len(row)-2): line = line + str(row[i]) + '|' line = line + str(row[len(row)-1]) print(line) def save_as(self, fname): """Save the database as a text file""" SELECT = """SELECT * FROM %s;""" % self.table self.cur.execute(SELECT) f = open(fname, 'w') for row in self.cur: line = '' for i in range(len(row)-2): line = line + str(row[i]) + '|' line = line + str(row[len(row)-1]) f.write(line + '\n') f.close() globs-0.2.0~svn50/src/Globs/hwd.py0000664000175000017500000001066611516033401016201 0ustar takakitakaki## hwd.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os class HWDetect: """Hardware detection class""" def __init__(self): self.__hostname = self.fetch_hostname() self.__cpu_info = self.gather_CPU_info() self.__gl_info = self.gather_GL_info() self.__mem_info = self.gather_MEM_info() def __getitem__(self, key): """Return hardware info""" if key == 'host': return self.__hostname elif key == 'cpu': return self.__cpu_info[0] elif key == 'cpus': return self.__cpu_info elif key == 'gl': return self.__gl_info elif key == 'mem': return self.__mem_info else: raise KeyError def fetch_hostname(self): """Fetch and store machine hostname""" try: file = open('/proc/sys/kernel/hostname') except IOError: return None line = file.readline() file.close() # Remove trailing '\n' if line[len(line)-1] == '\n': line = line[:len(line)-1] return line def gather_CPU_info(self): """Gather info about the CPU""" try: file = open('/proc/cpuinfo') except IOError: return None lines = file.readlines() file.close() # Multi CPU support cpu_list = [] for line in lines: if line.find('processor') == 0: splitted = line.split(':') id = int(splitted[1].strip()) cpu = {} cpu_list.append(cpu) elif line.find('model name') == 0: splitted = line.split(':') cpu_list[id]['model'] = splitted[1].strip() elif line.find('cpu MHz') == 0: splitted = line.split(':') cpu_list[id]['frequency'] = splitted[1].strip() elif line.find('bogomips') == 0: splitted = line.split(':') cpu_list[id]['bogomips'] = splitted[1].strip() return cpu_list def gather_MEM_info(self): """Gather info about the memory installed""" try: file = open('/proc/meminfo') except IOError: return None lines = file.readlines() file.close() for line in lines: if line.find('MemTotal') == 0: splitted = line.split(':') physical = splitted[1].strip() # removing 'kB' suffix physical = physical.split(' ') physical = physical[0].strip() elif line.find('SwapTotal') == 0: splitted = line.split(':') swap = splitted[1].strip() # removing 'kB' suffix swap = swap.split(' ') swap = swap[0].strip() return {'physical': physical, 'swap': swap} def gather_GL_info(self): """Gather info about the OpenGL subsystem""" extensions = [] pipe = os.popen('glxinfo') lines = pipe.readlines() pipe.close() # Default values if nothing relevant is found from glxinfo output vendor = _('N/A') renderer = _('N/A') version = _('N/A') extensions = [] for line in lines: if line.find('OpenGL vendor string') == 0: splitted = line.split(':') vendor = splitted[1].strip() elif line.find('OpenGL renderer string') == 0: splitted = line.split(':') renderer = splitted[1].strip() elif line.find('OpenGL version string') == 0: splitted = line.split(':') version = splitted[1].strip() elif line.find('GL_') != -1: # This line contains a list of extensions splitted = line.split(',') for ext in splitted: if ext.find('\n') == -1: extensions.append(ext.strip()) return {'vendor': vendor, 'renderer': renderer, 'version': version, 'extensions': extensions} def get_hostname(self): """Return the hostname""" return self.__hostname def get_cpu_info(self): """Return info about the first cpu detected""" return self.__cpu_info[0] def get_cpus_info(self): """Return info about all the available cpus""" return self.__cpu_info def get_gl_info(self): """Return the OpenGL subsystem info""" return self.__gl_info def get_mem_info(self): """Return memory info""" return self.__mem_info globs-0.2.0~svn50/src/Globs/main_win.py0000664000175000017500000003602411516033401017214 0ustar takakitakaki## main_win.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import sys import os import pygtk pygtk.require('2.0') import gtk import webbrowser import about_dlg, hwd_win, pref_win, local_db_win, stats_area import Globs class Main_Window: def __init__(self, app_cls): """Handle the main window""" # Getting instances of "singleton" classes self.db = app_cls.db self.bm = app_cls.bm self.stats = app_cls.stats self.user = app_cls.user self.hwd = app_cls.hwd self.submit = app_cls.submit self.share_dir = app_cls.share_dir self.ui_dir = app_cls.ui_dir self.ui = gtk.Builder() self.ui.add_from_file(os.path.join(self.ui_dir, 'main_win.ui')) app_signals = { "on_main_win_destroy": self.on_main_win_destroy, "on_detected_hw_activate": self.on_detected_hw_activate, "on_preferences_activate": self.on_preferences_activate, "on_local_db_activate": self.on_local_db_activate, "on_clear_activate": self.on_clear_activate, "on_purge_activate": self.on_purge_activate, "on_dump_activate": self.on_dump_activate, "on_show_remote_activate": self.on_show_remote_activate, "on_quit_activate": self.on_quit_activate, "on_about_activate": self.on_about_activate, "on_help_activate": self.on_help_activate, "on_bench_list_button_press_event": self.on_bench_list_button_press_event, "on_bench_list_row_activated": self.on_bench_list_row_activated, "on_execute_button_clicked": self.on_execute_button_clicked, "on_res_combobox_changed": self.on_res_combobox_changed, "on_lock_check_toggled": self.on_lock_check_toggled } self.ui.connect_signals(app_signals) # Getting widgets self.window = self.ui.get_object("main_win") self.bench_list = self.ui.get_object("bench_list") # Informations self.info_textview = self.ui.get_object("info_textview") # Options self.options_frame = self.ui.get_object("options_frame") self.res_combobox = self.ui.get_object("res_combobox") self.width_spin = self.ui.get_object("width_spin") self.height_spin = self.ui.get_object("height_spin") self.time_spin = self.ui.get_object("time_spin") self.repeat_spin = self.ui.get_object("repeat_spin") self.fs_check = self.ui.get_object("fs_check") self.lock_check = self.ui.get_object("lock_check") # Statistics self.statsa = stats_area.Statistics_Area(self.stats) self.stats_vbox = self.ui.get_object("stats_vbox") self.statusbar = self.ui.get_object("statusbar") # Setting initial attributes pix = gtk.gdk.pixbuf_new_from_file(os.path.join(self.share_dir, 'pixmaps/globs.png')) gtk.window_set_default_icon(pix) self.window.set_icon(pix) self.info_buffer = self.ui.get_object("info_buffer") self.boldtag = self.info_buffer.create_tag('bold') self.boldtag.set_property('weight', 700) self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Name:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), _('N/A') + '\n') self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Author:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), _('N/A') + '\n') self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Description:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), _('N/A') + '\n') # Open/close window flags self.hwd_win = None self.pref_win = None self.local_db_win = None # Init methods self.setup_bench_list() self.setup_res_combobox() self.populate_bench_list() self.statsa.setup(self.stats_vbox) def setup_bench_list(self): """Setup the treeview for benchmarks list""" cell = gtk.CellRendererText() # Columns column = gtk.TreeViewColumn(_('Name')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 0) column.set_resizable(True) column.set_sort_column_id(0) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Version')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 1) column.set_resizable(True) column.set_sort_column_id(1) self.bench_list.append_column(column) column = gtk.TreeViewColumn(_('Best FPS')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 2) column.set_resizable(True) column.set_sort_column_id(2) self.bench_list.append_column(column) # Model self.liststore = gtk.ListStore(str, str, float) self.bench_list.set_model(self.liststore) # Selection Mode selection = self.bench_list.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) def setup_res_combobox(self): """Setup the resolutions combobox entry under the options tab""" liststore = gtk.ListStore(str) liststore.insert(0, (_('Custom'), )) liststore.insert(1, ('1280x1024', )) liststore.insert(2, ('1024x768', )) liststore.insert(3, ('800x600', )) liststore.insert(4, ('640x480', )) cell = gtk.CellRendererText() self.res_combobox.pack_start(cell, True) self.res_combobox.add_attribute(cell, 'text', 0) self.res_combobox.set_model(liststore) self.res_combobox.set_active(1) def populate_bench_list(self): """Populate the treeview with benchmarks""" for name in self.bm.get_names(): info = self.bm.get_info(name) self.liststore.append([info['name'], info['version'], 0]) def get_options(self): """Return an options dictionary from the options tab""" opts = {} opts['width'] = int(self.width_spin.get_value()) opts['height'] = int(self.height_spin.get_value()) opts['time'] = int(self.time_spin.get_value()) opts['repetitions'] = int(self.repeat_spin.get_value()) opts['fullscreen'] = self.fs_check.get_active() return opts def update_stats(self, name): """Update the statistics tab""" if name in self.bm.get_names() == False: print (name + " " + _("doesn't exist!")) return None self.statsa.update(name) # Callbacks def on_main_win_destroy(self, widget, data=None): """Quit the application""" return gtk.main_quit() def on_quit_activate(self, event): """Quit the application""" return gtk.main_quit() def on_detected_hw_activate(self, event): """Open the detected hardware window""" if self.hwd_win: self.hwd_win.window.present() else: ui_file = os.path.join(self.ui_dir, 'hwd_win.ui') self.hwd_win = hwd_win.HWDetect_Window(ui_file, self.hwd) self.hwd_win.window.connect('destroy', self.on_detected_hw_destroy) def on_detected_hw_destroy(self, event): """Close the detected hardware window""" self.hwd_win = None def on_preferences_activate(self, event): """Open the preferences window""" if self.pref_win: self.pref_win.window.present() else: ui_file = os.path.join(self.ui_dir, 'pref_win.ui') self.pref_win = pref_win.Preferences_Window(ui_file, self.user) self.pref_ok_sig_id = self.pref_win.ok_button.connect("clicked", self.on_preferences_button_clicked) self.pref_cancel_sig_id = self.pref_win.cancel_button.connect("clicked", self.on_preferences_button_clicked) self.pref_win.window.connect('destroy', self.on_preferences_destroy) def on_preferences_destroy(self, event): """Close the preferences window""" self.pref_win = None def on_preferences_button_clicked(self, event): """Destroy the preferences window either cancel or ok button is clicked""" self.pref_win.ok_button.disconnect(self.pref_ok_sig_id) self.pref_win.cancel_button.disconnect(self.pref_cancel_sig_id) self.pref_win.window.destroy() def on_local_db_activate(self, event): """Open the local database window""" if self.local_db_win: self.local_db_win.window.present() else: ui_file = os.path.join(self.ui_dir, 'local_db_win.ui') self.local_db_win = local_db_win.Local_DB_Window(ui_file, self.db, self.bm, self.user, self.submit) self.local_db_win.window.connect('destroy', self.on_local_db_destroy) def on_local_db_destroy(self, event): """Close the local database window""" self.local_db_win = None def on_purge_activate(self, event): """Purge the database from non existant benchmarks""" dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=_('Do you really want to purge the database?')) dlg.set_default_response(gtk.RESPONSE_NO) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: return else: self.db.purge(self.bm.get_names()) self.statusbar.push(1, _('Database purged')) def on_clear_activate(self, event): """Clear the whole database""" dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=_('Do you really want to clear the database?')) dlg.set_default_response(gtk.RESPONSE_NO) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: return else: self.db.clear() self.statusbar.push(1, _('Database cleared')) def on_dump_activate(self, event): """Dump the local database in a text file""" dlg = gtk.FileChooserDialog('DB Dump', self.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) dlg.set_default_response(gtk.RESPONSE_ACCEPT) response = dlg.run() if response == gtk.RESPONSE_ACCEPT: file = dlg.get_filename() else: dlg.destroy() return dlg.destroy() self.db.save_as(file) self.statusbar.push(1, _('Database saved as ') + file) def on_show_remote_activate(self, event): """Open the browser on the remote database browsing page""" webbrowser.open_new_tab(Globs.BROWSE_URL) def on_about_activate(self, event): """Open the about dialog""" ui_file = os.path.join(self.ui_dir, 'about_dlg.ui') about_dlg.About_Dialog(ui_file) return def on_help_activate(self, event): """Open the browser on the online help page""" webbrowser.open_new_tab(Globs.HELP_URL) def on_bench_list_button_press_event(self, widget, event, data=None): """A treeview element was clicked once""" try: (path, column, x, y) = self.bench_list.get_path_at_pos( int(event.x), int(event.y) ) except TypeError: # Returned None, no path at that position return self.bench_list.row_activated(path, self.bench_list.get_column(0)) def on_bench_list_row_activated(self, treeview, path, view_column): """A treeview element was activated""" iter = self.liststore.get_iter(path) (selname, ) = self.liststore.get(iter, 0) for name in self.bm.get_names(): info = self.bm.get_info(name) if info['name'] == selname: opts = info['defaults'] self.info_buffer.set_text('') self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Name:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), info['name'] + '\n') self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Author:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), info['author'] + '\n') self.info_buffer.insert_with_tags(self.info_buffer.get_end_iter(), _('Description:') + ' ', self.boldtag) self.info_buffer.insert(self.info_buffer.get_end_iter(), info['description'] + '\n') if self.lock_check.get_active() == False: self.res_combobox.set_active(0) self.width_spin.set_value(opts['width']) self.height_spin.set_value(opts['height']) self.time_spin.set_value(opts['time']) self.repeat_spin.set_value(1) self.fs_check.set_active(opts['fullscreen']) self.update_stats(name) def on_execute_button_clicked(self, widget, data=None): """Execute button was clicked, executing selected benchmarks""" selection = self.bench_list.get_selection() (model, paths) = selection.get_selected_rows() if len(paths) == 0: return elif len(paths) > 1: # multi-selection dlg = gtk.MessageDialog(type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=_('Do you really want to execute the selected benchmarks?')) dlg.set_default_response(gtk.RESPONSE_YES) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_NO: return for path in paths: iter = model.get_iter(path) name = model.get_value(iter, 0) if name not in self.bm.get_names(): continue #self.statusbar.push(1, _('Executing ') + name + '...') info = self.bm.get_info(name) opts = self.get_options() if 'repetitions' not in opts: opts['repetitions'] = 1 ver_str = self.hwd.get_gl_info()['version'] if self.bm.check_ver(name, ver_str) == False: dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format="OpenGL " + self.bm.get_info(name)['glversion'] + _(" is not available")) dlg.set_default_response(gtk.RESPONSE_CLOSE) dlg.run() dlg.destroy() return hwd_ext = self.hwd.get_gl_info()['extensions'] ext_list = self.bm.check_ext(name, hwd_ext) if ext_list.__class__ == list: # Returned a list of missing extensions missing_ext = '' for ext in ext_list: missing_ext += ext if ext_list.index(ext) != len(ext_list) - 1: missing_ext += ', ' dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format=_("You're missing the following extensions: " + missing_ext)) dlg.set_default_response(gtk.RESPONSE_CLOSE) dlg.run() dlg.destroy() return for i in range(opts['repetitions']): # Have been already executed one time fps = self.bm.run(name, opts) if fps != None: date = self.db.insert(info, opts, fps) # Inserting in the database self.stats.append(fps, name) # Appending in the statistics self.statusbar.push(1, name + _(' executed at ') + str(fps) + ' fps') model.set_value(iter, 2, self.stats.get_max(name)) self.update_stats(name) def on_res_combobox_changed(self, widget, data=None): """Setting width and height spin buttons from the combobox""" iter = self.res_combobox.get_active_iter() model = self.res_combobox.get_model() resolution = model.get_value(iter, 0) if resolution == _('Custom'): self.width_spin.set_sensitive(True) self.height_spin.set_sensitive(True) else: self.width_spin.set_sensitive(False) self.height_spin.set_sensitive(False) width = int(resolution.split('x')[0]) height = int(resolution.split('x')[1]) self.width_spin.set_value(width) self.height_spin.set_value(height) def on_lock_check_toggled(self, widget, data=None): """Locking or releasing options based on check button""" if self.lock_check.get_active(): self.options_frame.set_sensitive(False) else: self.options_frame.set_sensitive(True) globs-0.2.0~svn50/src/Globs/hwd_win.py0000664000175000017500000001237111516033401017051 0ustar takakitakaki## hwd_win.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import pygtk pygtk.require('2.0') import gtk class HWDetect_Window: """Open the detected hardware window""" def __init__(self, ui_file, hwd_cls): self.hwd = hwd_cls self.ui = gtk.Builder() self.ui.add_from_file(ui_file) app_signals = { "on_category_tree_button_press_event": self.on_category_tree_button_press_event, "on_category_tree_row_activated": self.on_category_tree_row_activated } self.ui.connect_signals(app_signals) self.categories = (_('General'), _('Processor'), _('Memory'), 'OpenGL') # Getting widgets self.window = self.ui.get_object("hwd_win") self.hpaned1 = self.ui.get_object("hpaned1") self.category_tree = self.ui.get_object("category_tree") self.content_tree = self.ui.get_object("content_tree") # Init methods self.setup_category_tree() self.setup_content_tree() self.populate_category_tree() self.populate_content_tree() def setup_category_tree(self): """Setup category tree""" cell = gtk.CellRendererText() # Columns column = gtk.TreeViewColumn(_('Category')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 0) column.set_resizable(True) column.set_sort_column_id(0) self.category_tree.append_column(column) self.category_tree.set_headers_clickable(False) # Model self.category_treestore = gtk.TreeStore(str) self.category_tree.set_model(self.category_treestore) def setup_content_tree(self): """Setup content tree""" cell = gtk.CellRendererText() # Columns column = gtk.TreeViewColumn(_('Attribute')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 0) column.set_resizable(True) column.set_sort_column_id(0) self.content_tree.append_column(column) column = gtk.TreeViewColumn(_('Value')) column.pack_start(cell, True) column.add_attribute(cell, 'text', 1) column.set_resizable(True) column.set_sort_column_id(1) self.content_tree.append_column(column) self.content_tree.set_headers_clickable(False) # Model self.content_treestore = {} for cat in self.categories: self.content_treestore[cat] = gtk.TreeStore(str, str) self.content_tree.set_model(self.content_treestore[self.categories[0]]) def populate_category_tree(self): """Populate the treeview with categories""" for cat in self.categories: self.category_treestore.append(None, [cat]) def populate_content_tree(self): """Populate content models""" self.content_treestore[_('General')].append(None, [_('Hostname') + ':', self.hwd['host']]) ncpu = len(self.hwd['cpus']) if ncpu == 1: # Single CPU self.content_treestore[_('Processor')].append(None, [_('Model') + ':', self.hwd['cpu']['model']]) self.content_treestore[_('Processor')].append(None, [_('Frequency') + ':', self.hwd['cpu']['frequency'] + ' MHz']) self.content_treestore[_('Processor')].append(None, ['BogoMIPS' + ':', self.hwd['cpu']['bogomips']]) elif ncpu > 1: # Multiple CPU cpu_list = self.hwd['cpus'] for cpu in cpu_list: cpu_iter = self.content_treestore[_('Processor')].append(None, [_('CPU') + ':', str(cpu_list.index(cpu))]) self.content_treestore[_('Processor')].append(cpu_iter, [_('Model') + ':', cpu['model']]) self.content_treestore[_('Processor')].append(cpu_iter, [_('Frequency') + ':', cpu['frequency'] + ' MHz']) self.content_treestore[_('Processor')].append(cpu_iter, ['Bogomips' + ':', cpu['bogomips']]) self.content_treestore['OpenGL'].append(None, [_('Vendor') + ':', self.hwd['gl']['vendor']]) self.content_treestore['OpenGL'].append(None, [_('Renderer') + ':', self.hwd['gl']['renderer']]) self.content_treestore['OpenGL'].append(None, [_('Version') + ':', self.hwd['gl']['version']]) self.content_treestore[_('Memory')].append(None, [_('Physical') + ':', self.hwd['mem']['physical'] + ' KB']) self.content_treestore[_('Memory')].append(None, [_('Swap') + ':', self.hwd['mem']['swap'] + ' KB']) # Callbacks def on_category_tree_button_press_event(self, widget, event, data=None): try: (path, column, x, y) = self.category_tree.get_path_at_pos( int(event.x), int(event.y) ) except TypeError: # Returned None, no path at that position return self.category_tree.row_activated(path, self.category_tree.get_column(0)) def on_category_tree_row_activated(self, treeview, path, view_column): iter = self.category_treestore.get_iter(path) (selname, ) = self.category_treestore.get(iter, 0) if selname in self.categories: self.content_tree.set_model(self.content_treestore[selname]) globs-0.2.0~svn50/src/Globs/submit.py0000664000175000017500000001134111516033401016711 0ustar takakitakaki## submit.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import urllib2 import urllib import Globs class Submit: """Interface between the application and the common results remote database""" def __init__(self, db_cls, user_cls, hwd_cls): self.db = db_cls self.user = user_cls self.hwd = hwd_cls # Defining constants for analyzing parse() return list # Benchmark neither inserted nor updated self.PARSE_ERROR_CONN = -1 # Error of the connection self.PARSE_ERROR_URL = -2 # Malformed URL self.PARSE_ERROR_DB_CONN = -3 # Error connecting to the database self.PARSE_ERROR_DB_SEL = -4 # Error selecting the database self.PARSE_ERROR_PASSWORD = -5 # Wrong password self.PARSE_NOTHING = -6 # Result didn't meet update conditions # ------------------- # Benchmark either inserted or updated self.PARSE_UPDATED = 1 # Updated self.PARSE_INSERTED = 2 # Inserted self.PARSE_INSERTED_NM = 3 # Inserted on a new machine self.PARSE_INSERTED_NUNM = 4 # Inserted on a new machine by a new user # ------------------- def send(self, date): """Create an encoded URL with parameters and append it to the script URL""" params = {} # User params['user_id'] = self.user['user'] params['user_password'] = self.user['password'] params['user_name'] = self.user['name'] params['user_location'] = self.user['location'] params['user_email'] = self.user['email'] params['user_homesite'] = self.user['homesite'] # Hardware cpu = self.hwd['cpu'] mem = self.hwd['mem'] gl = self.hwd['gl'] params['hostname'] = self.hwd['host'] params['cpu_model'] = cpu['model'] params['cpu_frequency'] = cpu['frequency'] params['cpu_bogomips'] = cpu['bogomips'] params['mem_total'] = mem['physical'] params['gl_renderer'] = gl['renderer'] params['gl_version'] = gl['version'] # Benchmark fetchall = self.db.select("WHERE date='%s'" % date) row = fetchall[0] params['bench_name'] = row[0] params['bench_version'] = row[1] params['bench_fps'] = row[2] params['bench_width'] = row[3] params['bench_height'] = row[4] params['bench_fullscreen'] = row[5] params['bench_time'] = row[6] # Check parameters integrity if params['user_id'] == None or \ params['user_password'] == None or \ params['hostname'] == None or \ params['bench_name'] == None or \ params['bench_fps'] == None: print(_('One or more compelling parameter is None!')) return False enc_params = urllib.urlencode(params) # Debug #print('\n', enc_params) # ----- try: file = urllib2.urlopen(Globs.SUBMIT_URL, enc_params) except IOError: print(_('An error occurred during the connection!\n')) return (False, self.PARSE_ERROR_CONN, 0) reply = file.readlines() file.close() response = self.parse(reply, params) return response def parse(self, reply, params): """Parsing PHP submit script reply""" """The response given is a list of two fields where: (1) is a boolean indicator for success (2) is a number indicating the action or the error type""" # Debug #print('\n', reply) # ----- for line in reply: if line.find('Missing parameters!') == 0: return (False, self.PARSE_ERROR_URL) elif line.find('database') >= 0: if line.find('connect') >= 0: return (False, self.PARSE_ERROR_DB_CONN) elif line.find('select') >= 0: return (False, self.PARSE_ERROR_DB_SEL) elif line.find('Wrong password for') == 0: return (False, self.PARSE_ERROR_PASSWORD) elif line.find('User ' + params['user_id']) == 0: if line.find('inserted') >= 0: return (True, self.PARSE_INSERTED_NUNM) elif line.find('Machine ' + params['hostname']) == 0: if line.find('inserted') >= 0: return (True, self.PARSE_INSERTED_NM) elif line.find(params['bench_name'] + ' executed') == 0: if line.find('inserted') >= 0: return (True, self.PARSE_INSERTED) elif line.find('updated') >= 0: return (True, self.PARSE_UPDATED) return (False, self.PARSE_NOTHING) globs-0.2.0~svn50/src/Globs/pref_win.py0000664000175000017500000000600511516033401017220 0ustar takakitakaki## pref_win.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import pygtk pygtk.require('2.0') import gtk class Preferences_Window: """Open the preferences window""" def __init__(self, ui_file, user_cls): self.user = user_cls self.ui = gtk.Builder() self.ui.add_from_file(ui_file) app_signals = { "on_ok_button_clicked": self.on_ok_button_clicked, "on_cancel_button_clicked": self.on_cancel_button_clicked } self.ui.connect_signals(app_signals) # Getting widgets self.window = self.ui.get_object("pref_win") self.cancel_button = self.ui.get_object("cancel_button") self.ok_button = self.ui.get_object("ok_button") self.user_entry = self.ui.get_object("user_entry") self.password_entry = self.ui.get_object("password_entry") self.name_entry = self.ui.get_object("name_entry") self.location_entry = self.ui.get_object("location_entry") self.email_entry = self.ui.get_object("email_entry") self.homesite_entry = self.ui.get_object("homesite_entry") # Init methods self.setup_entries() def setup_entries(self): """Setup information labels""" if self.user['user']: self.user_entry.set_text(str(self.user['user'])) if self.user['password']: self.password_entry.set_text(str(self.user['password'])) if self.user['name']: self.name_entry.set_text(str(self.user['name'])) if self.user['location']: self.location_entry.set_text(str(self.user['location'])) if self.user['email']: self.email_entry.set_text(str(self.user['email'])) if self.user['homesite']: self.homesite_entry.set_text(str(self.user['homesite'])) # Callbacks def on_ok_button_clicked(self, widget, data=None): """Save user information in the user table via the user class""" data = {} data['user'] = self.user_entry.get_text() if self.password_entry.get_text() != self.user['password']: is_md5 = False else: is_md5 = True data['password'] = self.password_entry.get_text() data['name'] = self.name_entry.get_text() data['location'] = self.location_entry.get_text() data['email'] = self.email_entry.get_text() data['homesite'] = self.homesite_entry.get_text() self.user.update(data, is_md5) def on_cancel_button_clicked(self, widget, data=None): """Close the preferences window""" self.window.destroy() globs-0.2.0~svn50/src/Globs/app.py0000664000175000017500000000327411516033401016174 0ustar takakitakaki## app.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os import pygtk pygtk.require('2.0') import gtk import benchmarks, hwd, user, local_db, submit, statistics import main_win class Application: """ This is the main application class. Its role is to instantiate the singleton classes which compose the program. """ def __init__(self, share_dir='', bench_dir=''): db_file = os.path.expanduser('~/.globs.db') self.share_dir = share_dir self.ui_dir = (os.path.join(share_dir, 'ui')) # Singletons self.db = local_db.Local_Database(db_file) self.hwd = hwd.HWDetect() self.bm = benchmarks.Benchmarks(os.path.join(bench_dir, 'benchmarks')) self.stats = statistics.Statistics(self.bm.get_names()) self.user = user.User(db_file) self.submit = submit.Submit(self.db, self.user, self.hwd) self.main_win = main_win.Main_Window(self) def run(self): """Make the gtk main loop start.""" gtk.main() globs-0.2.0~svn50/src/tests/0000775000175000017500000000000011516033442015135 5ustar takakitakakiglobs-0.2.0~svn50/src/tests/Globs0000777000175000017500000000000011516033401017377 2../Globs/ustar takakitakakiglobs-0.2.0~svn50/src/tests/user_test.py0000775000175000017500000000336611516033401017532 0ustar takakitakaki#!/usr/bin/env python ## submit_test.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import set_locale set_locale.set() from Globs import user def user_print(user): """Print user information stored inside an User clas""" print 'User: ' + str(user['user']) print 'Password: ' + str(user['password']) print 'Name: ' + str(user['name']) print 'Location: ' + str(user['location']) print 'e-mail: ' + str(user['email']) print 'Homesite: ' + str(user['homesite']) user = user.User('test.db') print user_data = {'user': 'encelo', 'password': 'mypass', 'name': 'Angelo Theodorou', 'location': 'Naples, Italy', 'email': 'encelo@users.sourceforge.net', 'homesite': 'http://autistici.org/encelo'} user.update(user_data) user_print(user) print user_data = {'user': 'encelo', 'password': 'different_pass', 'name': 'Angelo "Encelo" Theodorou', 'location': 'Naples, Italy', 'email': 'encelo@gmail.com', 'homesite': 'http://autistici.org/encelo'} user.update(user_data) user_print(user) print globs-0.2.0~svn50/src/tests/info_bench.py0000775000175000017500000000242211516033401017577 0ustar takakitakaki#!/usr/bin/env python ## info_bench.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## from Globs import benchmarks bm = benchmarks.Benchmarks('../benchmarks') for name in bm.get_names(): #info = bm.get_info(name) info = bm[name] # Using special method __getitem__() print 'Name: ' + info['name'] print 'Author: ' + info['author'] print 'Version: ' + info['version'] print 'Description: ' + info['description'] if info.has_key('extensions'): print 'Extensions: ' + str(info['extensions']) print globs-0.2.0~svn50/src/tests/info_hw.py0000775000175000017500000000264511516033401017145 0ustar takakitakaki#!/usr/bin/env python ## info_hw.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## from Globs import hwd hwd = hwd.HWDetect() cpu_list = hwd['cpus'] mem = hwd['mem'] gl = hwd['gl'] print print 'Hostname:', hwd['host'] print for cpu in cpu_list: print 'CPU' + str(cpu_list.index(cpu)) print 'Model:', cpu['model'] print 'Frequency:', cpu['frequency'], 'MHz' print 'BogoMIPS:', cpu['bogomips'] print print 'MEM' print 'Physical:', mem['physical'], 'kB' print 'Swap:', mem['swap'], 'kB' print print 'GL' print 'Vendor:', gl['vendor'] print 'Renderer:', gl['renderer'] print 'Version:', gl['version'] print 'N. Extensions:', len(gl['extensions']) print globs-0.2.0~svn50/src/tests/stats_bench.py0000775000175000017500000000377711516033401020020 0ustar takakitakaki#!/usr/bin/env python ## stats_bench.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import time as t from Globs import statistics try: import matplotlib.numerix as n except ImportError: with_matplotlib = False # Matplotlib and NumPy are not installed! else: with_matplotlib = True name = 'Test' implementations = [] st_ar = statistics.Statistics_Array([name]) implementations.append(st_ar) if with_matplotlib == True: st_ix = statistics.Statistics_Numerix([name]) implementations.append(st_ix) n = 10000 # Number of insertion in the array print 'N. insertion: ' + str(n) print for st in implementations: if str(st).find('Numerix') >= 0: print 'Numerix version' else: print 'Built-in Array module version' start = t.time() for i in range(n): st.append(i, name) stop_1 = t.time() max = st.get_max(name) min = st.get_min(name) last = st.get_last(name) stop_2 = t.time() avg = st.get_avg(name) stop_3 = t.time() print 'Last 5 elements: %s' % str(st.get_array(name, 5)) print 'Min: %f, Avg: %f, Max: %f, Last: %f' % (min, avg, max, last) print 'Insertion time: %f' % (stop_1-start) print 'Get Max, Min, Last time: %f' % (stop_2-stop_1) print 'Get Avg time: %f' % (stop_3-stop_2) print 'Total time: %f' % (stop_3-start) print globs-0.2.0~svn50/src/tests/fake_stats.py0000775000175000017500000000270011516033401017630 0ustar takakitakaki#!/usr/bin/env python ## fake_stats.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## from Globs import benchmarks, statistics name = 'Fake' bm = benchmarks.Benchmarks('../benchmarks') st = statistics.Statistics([name]) opts = {"fullscreen":False, "width":640, "height":480, "time":2} n = 5 print 'Benchmark: ' + name print 'Options dictionary: ' + str(opts) print for i in range(n): fps = bm.run(name, opts) st.append(fps, name) if (fps != None): print 'FPS: ' + str(fps) max = st.get_max(name) min = st.get_min(name) last = st.get_last(name) avg = st.get_avg(name) print print 'N. executions: ' + str(n) print 'Min: %f, Avg: %f, Max: %f, Last: %f' % (min, avg, max, last) globs-0.2.0~svn50/src/tests/benchmarks0000777000175000017500000000000011516033401021515 2../benchmarks/ustar takakitakakiglobs-0.2.0~svn50/src/tests/db_bench_test.py0000775000175000017500000000266511516033401020301 0ustar takakitakaki#!/usr/bin/env python ## db_bench_test.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import set_locale set_locale.set() from Globs import local_db, benchmarks db = local_db.Local_Database('test.db') bm = benchmarks.Benchmarks('../benchmarks') for name in bm.get_names(): info = bm.get_info(name) opts = info['defaults'] fps = bm.run(name) if(db.insert(info, opts, fps)): print name + ' inserted into the db' print print 'The entire table:' db.show() print print 'GL_shadow deleted:' db.delete('GL_shadow') db.show() print print 'All deleted except Fake and GL_smoke:' db.purge(('Fake', 'GL_smoke')) db.show() print print 'Table cleared.' db.clear() db.show() globs-0.2.0~svn50/src/tests/run_bench.py0000775000175000017500000000311511516033401017450 0ustar takakitakaki#!/usr/bin/env python ## run_bench.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import set_locale set_locale.set() from Globs import benchmarks, statistics bm = benchmarks.Benchmarks('../benchmarks') st = statistics.Statistics(bm.get_names()) opts = None #opts = {"fullscreen":True, "width":1024, "height":768, "time":5} for name in bm.get_names(): print 'Benchmark: ' + name fps = bm.run(name, opts) st.append(fps, name) if (fps != None): print 'Options dictionary: ' + str(bm.get_options(name)) print 'FPS: ' + str(fps) print count = 0 total = 0 print 'Fake benchmark ignored' for name in bm.get_names(): if name != 'Fake': max = st.get_max(name) if max != None: count += 1 total += max else: continue print 'N. benchmarks executed: ' + str(count) print 'Mean FPS = ' + str(total/count) globs-0.2.0~svn50/src/tests/submit_test.py0000775000175000017500000000326611516033401020056 0ustar takakitakaki#!/usr/bin/env python ## submit_test.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import set_locale set_locale.set() from Globs import local_db, benchmarks, user, hwd, submit bench_name = 'Fake' db = local_db.Local_Database('test.db') bm = benchmarks.Benchmarks('../benchmarks') user = user.User('test.db') hwd = hwd.HWDetect() submit = submit.Submit(db, user, hwd, 'http://globs.sourceforge.net/db_submit.php') db.clear() info = bm.get_info(bench_name) opts = info['defaults'] fps = bm.run(bench_name, None) date = db.insert(info, opts, fps) print 'Bench name: ' + bench_name print 'FPS: ' + str(fps) print 'Date: ' + date print data = {'user':'encelo', 'password':'pass', 'name': 'Angelo Theodorou', 'location':'Naples, Italy', 'email':'encelo@users.sourceforge.net', 'homesite':'http://autistici.org/encelo'} user.update(data) submit.send(date) data['password'] = 'wrong' print user.update(data) submit.send(date) globs-0.2.0~svn50/src/tests/parse.py0000775000175000017500000000076111516033401016623 0ustar takakitakaki#!/usr/bin/env python import xml.parsers.expat xmlfile = '../../globs.glade' def start_el(name, attrs): #print 'Start: ', name, attrs pass def end_el(name): #print 'End: ', name pass def char_data(data): #print 'Character data:', repr(data) pass p = xml.parsers.expat.ParserCreate() p.StartElementHandler = start_el p.EndElementHandler = end_el p.CharacterDataHandler = char_data string = '' f = open(xmlfile, 'r') for line in f.readlines(): string += line f.close() p.Parse(string) globs-0.2.0~svn50/src/tests/set_locale.py0000664000175000017500000000034211516033401017613 0ustar takakitakakilocale_dir = '../../po' import locale import gettext def set(): locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain('globs', locale_dir) gettext.textdomain('globs') gettext.install('globs', locale_dir, unicode=1) globs-0.2.0~svn50/src/globs0000775000175000017500000000232511516033401015024 0ustar takakitakaki#!/usr/bin/env python ## globs ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## share_dir = '..' locale_dir = '../po' bench_dir = '.' import locale import gettext from gtk import glade from Globs import app locale.setlocale(locale.LC_ALL, '') for module in gettext, glade: module.bindtextdomain('globs', locale_dir) module.textdomain('globs') gettext.install('globs', locale_dir, unicode=1) app = app.Application(share_dir, bench_dir) app.run() globs-0.2.0~svn50/src/benchmarks/0000775000175000017500000000000011516033442016110 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/SConstruct0000664000175000017500000000257411516033423020151 0ustar takakitakakiimport os, SCons # import variables try: Import('install_dir') except SCons.Errors.UserError: # Install directory root = ARGUMENTS.get('root', '/') prefix = ARGUMENTS.get('prefix', 'usr/local') if root != '' and prefix != '': # not defaults if prefix[0] == '/': prefix = prefix[1:] install_dir = os.path.join(root, prefix, 'share/globs/benchmarks') # create build environment env = Environment() # determine compiler and linker flags for SDL env.ParseConfig('sdl-config --cflags') env.ParseConfig('sdl-config --libs') # check for libraries and headers (if not cleaning) if not env.GetOption('clean'): print ":: Checking for libs" conf = Configure(env) if not conf.CheckLibWithHeader('libSDL', 'SDL.h', 'c', 'SDL_Init(SDL_INIT_VIDEO);', autoadd=0): print 'Did not find libSDL, exiting!' Exit(1) if not conf.CheckLibWithHeader('libSDL_image', 'SDL_image.h', 'c', 'IMG_GetError();'): print 'Did not find libSDL_image, exiting!' Exit(1) if not conf.CheckLibWithHeader('libGL', 'GL/gl.h', 'c', 'glLoadIdentity();'): print 'Did not find libGL, exiting!' Exit(1) env = conf.Finish() # print building message if not env.GetOption('clean'): print ":: Compiling benchmarks for posix" # run sub scripts Export('env', 'install_dir') # benchmarks dirs = ('Fake', 'GL_smoke', 'GL_pointz', 'GL_shadow', 'GL_blit', 'GLSL_parallax') for x in dirs: SConscript(x + '/SConscript') globs-0.2.0~svn50/src/benchmarks/GL_shadow/0000775000175000017500000000000011516033442017757 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/GL_shadow/Makefile0000664000175000017500000000125411516033423021420 0ustar takakitakakiCC = gcc LD = gcc CFLAGS = `sdl-config --cflags` LDFLAGS = `sdl-config --libs` -lSDL_image -lGL RM = /bin/rm -f OBJS = main.o object.o extra.o shadow.o .PHONY: clean all: gl_shadow test_obj gl_shadow: $(OBJS) $(LD) $(LDFLAGS) -o gl_shadow $(OBJS) test_obj: test_obj.o object.o $(LD) $(LDFLAGS) -o test_obj test_obj.o object.o main.o: main.c extra.h object.h shadow.h $(CC) $(CFLAGS) -c main.c object.o: object.c object.h $(CC) $(CFLAGS) -c object.c extra.o: extra.c extra.h $(CC) $(CFLAGS) -c extra.c shadow.o: shadow.c shadow.h $(CC) $(CFLAGS) -c shadow.c test_obj.o: test_obj.c object.h $(CC) $(CFLAGS) -c test_obj.c clean: $(RM) *~ $(OBJS) gl_shadow test_obj test_obj.o globs-0.2.0~svn50/src/benchmarks/GL_shadow/README0000664000175000017500000000467211516033423020647 0ustar takakitakakiGL_shadow: an implementation of the stencil shadow volume technique Copyright (C) 2005 Angelo "Encelo" Theodorou Info ---- Welcome to a little more complex demo, which required studying Blender Python OBJ importer, NeHe's lesson 27 and some other docs about shadow volume technique. Actually the demo is a merge of an OBJ loader and some code for real-time shadow generation using the depth pass test (zpass). If you are curious about testing the program with something heavier than a cube make it load suzanne.obj instead of cube.obj and you will admire the shadow projected by Suzanne, Blender's mascotte. :) (On my card it scores near 1/5th of cube performance) Compiling --------- In order to compile use the included Makefile. Should you have any problem with includes or libs, tweak it to suit your needs. TODO and shortcomings of the current version -------------------------------------------- - It would really like to actually implement Carmack's Reverse and volume capping, maybe in the future. - Calculating the inverse matrix would make calculation of light position relative to object a lot easier. - Shadow volume should be clipped to the view volume. - Lights could be represented by a transparent textured quad or an object. - Take in consideration object material properties. - Update OBJ loader to the new (and I think more correct) Blender 2.40 importer script. - Silhouette edge calculation is done twice even if it remains the same for both calls of ShadowVolume() inside CastShadow(). - I think there's an issue with normals and back facing polygons because, as you may easily notice, when a light is near a wall this become darker instead of brighter! :) Notes ----- - test_obj is a program made for testing OBJ loader routines, invoke it with an OBJ file as parameter. - cube.mtl is filled with fake materials to show that the loader is actually capable of loading parameters from the right one. - In this demo FrameTiming() and perspectiveGL() were moved in extra.c, leaving to main.c only the main() function. - I have added code for window resizing based on SDL events and OpenGL frustum and viewport recalibration. - The prgram stops when the window loses input focus or is iconified. Strangely SDL_APPINPUTFOCUS event is thrown even when the application regain only mouse focus. - Projecting the shadow volume to infinity is achieved setting the w component of the projected points of the volume to 0. Take a look to shadow.c comments. globs-0.2.0~svn50/src/benchmarks/GL_shadow/main.c0000664000175000017500000001422211516033423021047 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique Copyright (C) 2005 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "extra.h" #include "object.h" #include "shadow.h" #include "../get_options.h" #include "../check_time.h" int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; int quit = 0; const SDL_VideoInfo* info = NULL; int bpp = 0; int flags = 0; GLint stencil = 0; Uint32 interval; Object *object; Light light1 = {{ 0.0f, 1.5f,-1.5f, 1.0f}, { 0.7f, 0.7f, 0.7f, 1.0f}, { 0.7f, 0.7f, 0.7f, 1.0f}, { 1.0f, 1.0f, 1.0f, 1.0f}}; Light light2 = {{-1.5f,-1.8f, 0.0f, 1.0f}, { 0.4f, 0.4f, 0.4f, 1.0f}, { 0.4f, 0.4f, 0.4f, 1.0f}, { 1.0f, 1.0f, 1.0f, 1.0f}}; GLfloat rot = 0; GLfloat angle = 0; GLfloat Minv[16]; GLfloat lp1_o1[4], lp2_o1[4], lp1_o2[4], lp2_o2[4]; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; /* ----- OpenGL attribute setting via SDL --------------- */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(opt.width, opt.height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } glGetIntegerv(GL_STENCIL_BITS, &stencil); if(stencil == 0){ printf("Stencil buffer not available!\n"); exit(-1); } SDL_WM_SetCaption("GL_shadow by Encelo", NULL); /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* The following function replaces gluPerspective */ perspectiveGL(45.0f, (GLfloat)opt.width/(GLfloat)opt.height, 0.001f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); /* ----- Init scene --------------- */ if((object = InitObject("cube.obj")) == NULL){ printf("Cannot load the object!\n"); return -1; } printf("Object loaded\n"); printf("Name: %s\n", object->Name); printf("Number of Faces: %d\n", object->nFaces); printf("Number of Vertices: %d\n", object->nVertices); printf("\n"); /* ----- Event cycle --------------- */ while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch( event.key.keysym.sym ){ case SDLK_ESCAPE: case SDLK_q: quit = 1; break; case SDLK_F1: SDL_WM_ToggleFullScreen(screen); break; } break; } } /* Exit after 'opt.time' seconds */ if(check_time(opt.time)) break; interval = FrameTiming(); /* ----- Blitting on the screen --------------- */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); rot += 0.1f * interval; angle += 0.001f * interval; glLoadIdentity(); glTranslatef(0.0f, 0.0f, -7.5f); /* Negative Zoom */ /* ----- Light ----- */ light1.Position[0] = sinf(angle) * 1.5f; light1.Position[2] = cosf(angle) * 1.5f; light2.Position[1] = sinf(angle) * 1.5f; light2.Position[2] = cosf(angle) * 1.5f; UpdateLight(&light1, GL_LIGHT1, 0.1f); UpdateLight(&light2, GL_LIGHT2, 0.1f); /* ----- Storing light position relative to shadow casting objects -----*/ glPushMatrix(); /* Inverse transformation of the 1st object */ glLoadIdentity(); glScalef(5.0f, 5.0f, 5.0f); glRotatef(rot, 0.0f, -1.0f, 0.0f); glTranslatef(0.0f, 1.0f, 0.0f); glGetFloatv(GL_MODELVIEW_MATRIX, Minv); /* Light 1 */ CpVec(light1.Position, lp1_o1, 4); VMatMult(Minv, lp1_o1); /* Light 2 */ CpVec(light2.Position, lp2_o1, 4); VMatMult(Minv, lp2_o1); /* Inverse transformation of the 2nd object */ glLoadIdentity(); glScalef(5.0f, 5.0f, 5.0f); glTranslatef(0.0f, 1.8f, -0.7f); glGetFloatv(GL_MODELVIEW_MATRIX, Minv); /* Light 1 */ CpVec(light1.Position, lp1_o2 ,4); VMatMult(Minv, lp1_o2); /* Light 2 */ CpVec(light2.Position, lp2_o2 ,4); VMatMult(Minv, lp2_o2); glPopMatrix(); /* ----- Objects ----- */ glPushMatrix(); glScalef(2.0f, 2.0f, 2.0f); DrawRoom(); glPopMatrix(); /* Second Object */ glPushMatrix(); glTranslatef(0.0f, -1.8f, 0.7f); glScalef(0.2f, 0.2f, 0.2f); DrawObject(object); CastShadow(object, lp1_o2); CastShadow(object, lp2_o2); glPopMatrix(); /* First Object */ glPushMatrix(); glTranslatef(0.0f, -1.0f, 0.0f); glRotatef(rot, 0.0f, 1.0f, 0.0f); glScalef(0.2f, 0.2f, 0.2f); DrawObject(object); CastShadow(object, lp1_o1); CastShadow(object, lp2_o1); glPopMatrix(); DrawShadow(); SDL_GL_SwapBuffers(); /* SDL_Delay(25); */ /* Decomment this if you want 1/50th screen update */ } /* ----- Quitting --------------- */ FreeObject(object); SDL_Quit(); return 0; } globs-0.2.0~svn50/src/benchmarks/GL_shadow/suzanne.obj0000664000175000017500000072527011516033423022152 0ustar takakitakaki# Blender OBJ File: /home/encelo/NEW/scenes/hi_mench_newsetting.blend # www.blender.org mtllib suzanne.mtl o Suzanne v 0.4375 0.1640625 0.765625 v -0.4375 0.1640625 0.765625 v 0.5 0.09375 0.6875 v -0.5 0.09375 0.6875 v 0.546875 0.0546875 0.578125 v -0.546875 0.0546875 0.578125 v 0.3515625 -0.0234375 0.6171875 v -0.3515625 -0.0234375 0.6171875 v 0.3515625 0.03125 0.71875 v -0.3515625 0.03125 0.71875 v 0.3515625 0.1328125 0.78125 v -0.3515625 0.1328125 0.78125 v 0.2734375 0.1640625 0.796875 v -0.2734375 0.1640625 0.796875 v 0.203125 0.09375 0.7421875 v -0.203125 0.09375 0.7421875 v 0.15625 0.0546875 0.6484375 v -0.15625 0.0546875 0.6484375 v 0.078125 0.2421875 0.65625 v -0.078125 0.2421875 0.65625 v 0.140625 0.2421875 0.7421875 v -0.140625 0.2421875 0.7421875 v 0.2421875 0.2421875 0.796875 v -0.2421875 0.2421875 0.796875 v 0.2734375 0.328125 0.796875 v -0.2734375 0.328125 0.796875 v 0.203125 0.390625 0.7421875 v -0.203125 0.390625 0.7421875 v 0.15625 0.4375 0.6484375 v -0.15625 0.4375 0.6484375 v 0.3515625 0.515625 0.6171875 v -0.3515625 0.515625 0.6171875 v 0.3515625 0.453125 0.71875 v -0.3515625 0.453125 0.71875 v 0.3515625 0.359375 0.78125 v -0.3515625 0.359375 0.78125 v 0.4375 0.328125 0.765625 v -0.4375 0.328125 0.765625 v 0.5 0.390625 0.6875 v -0.5 0.390625 0.6875 v 0.546875 0.4375 0.578125 v -0.546875 0.4375 0.578125 v 0.625 0.2421875 0.5625 v -0.625 0.2421875 0.5625 v 0.5625 0.2421875 0.671875 v -0.5625 0.2421875 0.671875 v 0.46875 0.2421875 0.7578125 v -0.46875 0.2421875 0.7578125 v 0.4765625 0.2421875 0.7734375 v -0.4765625 0.2421875 0.7734375 v 0.4453125 0.3359375 0.78125 v -0.4453125 0.3359375 0.78125 v 0.3515625 0.375 0.8046875 v -0.3515625 0.375 0.8046875 v 0.265625 0.3359375 0.8203125 v -0.265625 0.3359375 0.8203125 v 0.2265625 0.2421875 0.8203125 v -0.2265625 0.2421875 0.8203125 v 0.265625 0.15625 0.8203125 v -0.265625 0.15625 0.8203125 v 0.3515625 0.2421875 0.828125 v -0.3515625 0.2421875 0.828125 v 0.3515625 0.1171875 0.8046875 v -0.3515625 0.1171875 0.8046875 v 0.4453125 0.15625 0.78125 v -0.4453125 0.15625 0.78125 v 0.0 0.4296875 0.7421875 v 0.0 0.3515625 0.8203125 v 0.0 -0.6796875 0.734375 v 0.0 -0.3203125 0.78125 v 0.0 -0.1875 0.796875 v 0.0 -0.7734375 0.71875 v 0.0 0.40625 0.6015625 v 0.0 0.5703125 0.5703125 v 0.0 0.8984375 -0.546875 v 0.0 0.5625 -0.8515625 v 0.0 0.0703125 -0.828125 v 0.0 -0.3828125 -0.3515625 v 0.203125 -0.1875 0.5625 v -0.203125 -0.1875 0.5625 v 0.3125 -0.4375 0.5703125 v -0.3125 -0.4375 0.5703125 v 0.3515625 -0.6953125 0.5703125 v -0.3515625 -0.6953125 0.5703125 v 0.3671875 -0.890625 0.53125 v -0.3671875 -0.890625 0.53125 v 0.328125 -0.9453125 0.5234375 v -0.328125 -0.9453125 0.5234375 v 0.1796875 -0.96875 0.5546875 v -0.1796875 -0.96875 0.5546875 v 0.0 -0.984375 0.578125 v 0.4375 -0.140625 0.53125 v -0.4375 -0.140625 0.53125 v 0.6328125 -0.0390625 0.5390625 v -0.6328125 -0.0390625 0.5390625 v 0.828125 0.1484375 0.4453125 v -0.828125 0.1484375 0.4453125 v 0.859375 0.4296875 0.59375 v -0.859375 0.4296875 0.59375 v 0.7109375 0.484375 0.625 v -0.7109375 0.484375 0.625 v 0.4921875 0.6015625 0.6875 v -0.4921875 0.6015625 0.6875 v 0.3203125 0.7578125 0.734375 v -0.3203125 0.7578125 0.734375 v 0.15625 0.71875 0.7578125 v -0.15625 0.71875 0.7578125 v 0.0625 0.4921875 0.75 v -0.0625 0.4921875 0.75 v 0.1640625 0.4140625 0.7734375 v -0.1640625 0.4140625 0.7734375 v 0.125 0.3046875 0.765625 v -0.125 0.3046875 0.765625 v 0.203125 0.09375 0.7421875 v -0.203125 0.09375 0.7421875 v 0.375 0.015625 0.703125 v -0.375 0.015625 0.703125 v 0.4921875 0.0625 0.671875 v -0.4921875 0.0625 0.671875 v 0.625 0.1875 0.6484375 v -0.625 0.1875 0.6484375 v 0.640625 0.296875 0.6484375 v -0.640625 0.296875 0.6484375 v 0.6015625 0.375 0.6640625 v -0.6015625 0.375 0.6640625 v 0.4296875 0.4375 0.71875 v -0.4296875 0.4375 0.71875 v 0.25 0.46875 0.7578125 v -0.25 0.46875 0.7578125 v 0.0 -0.765625 0.734375 v 0.109375 -0.71875 0.734375 v -0.109375 -0.71875 0.734375 v 0.1171875 -0.8359375 0.7109375 v -0.1171875 -0.8359375 0.7109375 v 0.0625 -0.8828125 0.6953125 v -0.0625 -0.8828125 0.6953125 v 0.0 -0.890625 0.6875 v 0.0 -0.1953125 0.75 v 0.0 -0.140625 0.7421875 v 0.1015625 -0.1484375 0.7421875 v -0.1015625 -0.1484375 0.7421875 v 0.125 -0.2265625 0.75 v -0.125 -0.2265625 0.75 v 0.0859375 -0.2890625 0.7421875 v -0.0859375 -0.2890625 0.7421875 v 0.3984375 -0.046875 0.671875 v -0.3984375 -0.046875 0.671875 v 0.6171875 0.0546875 0.625 v -0.6171875 0.0546875 0.625 v 0.7265625 0.203125 0.6015625 v -0.7265625 0.203125 0.6015625 v 0.7421875 0.375 0.65625 v -0.7421875 0.375 0.65625 v 0.6875 0.4140625 0.7265625 v -0.6875 0.4140625 0.7265625 v 0.4375 0.546875 0.796875 v -0.4375 0.546875 0.796875 v 0.3125 0.640625 0.8359375 v -0.3125 0.640625 0.8359375 v 0.203125 0.6171875 0.8515625 v -0.203125 0.6171875 0.8515625 v 0.1015625 0.4296875 0.84375 v -0.1015625 0.4296875 0.84375 v 0.125 -0.1015625 0.8125 v -0.125 -0.1015625 0.8125 v 0.2109375 -0.4453125 0.7109375 v -0.2109375 -0.4453125 0.7109375 v 0.25 -0.703125 0.6875 v -0.25 -0.703125 0.6875 v 0.265625 -0.8203125 0.6640625 v -0.265625 -0.8203125 0.6640625 v 0.234375 -0.9140625 0.6328125 v -0.234375 -0.9140625 0.6328125 v 0.1640625 -0.9296875 0.6328125 v -0.1640625 -0.9296875 0.6328125 v 0.0 -0.9453125 0.640625 v 0.0 0.046875 0.7265625 v 0.0 0.2109375 0.765625 v 0.328125 0.4765625 0.7421875 v -0.328125 0.4765625 0.7421875 v 0.1640625 0.140625 0.75 v -0.1640625 0.140625 0.75 v 0.1328125 0.2109375 0.7578125 v -0.1328125 0.2109375 0.7578125 v 0.1171875 -0.6875 0.734375 v -0.1171875 -0.6875 0.734375 v 0.078125 -0.4453125 0.75 v -0.078125 -0.4453125 0.75 v 0.0 -0.4453125 0.75 v 0.0 -0.328125 0.7421875 v 0.09375 -0.2734375 0.78125 v -0.09375 -0.2734375 0.78125 v 0.1328125 -0.2265625 0.796875 v -0.1328125 -0.2265625 0.796875 v 0.109375 -0.1328125 0.78125 v -0.109375 -0.1328125 0.78125 v 0.0390625 -0.125 0.78125 v -0.0390625 -0.125 0.78125 v 0.0 -0.203125 0.828125 v 0.046875 -0.1484375 0.8125 v -0.046875 -0.1484375 0.8125 v 0.09375 -0.15625 0.8125 v -0.09375 -0.15625 0.8125 v 0.109375 -0.2265625 0.828125 v -0.109375 -0.2265625 0.828125 v 0.078125 -0.25 0.8046875 v -0.078125 -0.25 0.8046875 v 0.0 -0.2890625 0.8046875 v 0.2578125 -0.3125 0.5546875 v -0.2578125 -0.3125 0.5546875 v 0.1640625 -0.2421875 0.7109375 v -0.1640625 -0.2421875 0.7109375 v 0.1796875 -0.3125 0.7109375 v -0.1796875 -0.3125 0.7109375 v 0.234375 -0.25 0.5546875 v -0.234375 -0.25 0.5546875 v 0.0 -0.875 0.6875 v 0.046875 -0.8671875 0.6875 v -0.046875 -0.8671875 0.6875 v 0.09375 -0.8203125 0.7109375 v -0.09375 -0.8203125 0.7109375 v 0.09375 -0.7421875 0.7265625 v -0.09375 -0.7421875 0.7265625 v 0.0 -0.78125 0.65625 v 0.09375 -0.75 0.6640625 v -0.09375 -0.75 0.6640625 v 0.09375 -0.8125 0.640625 v -0.09375 -0.8125 0.640625 v 0.046875 -0.8515625 0.6328125 v -0.046875 -0.8515625 0.6328125 v 0.0 -0.859375 0.6328125 v 0.171875 0.21875 0.78125 v -0.171875 0.21875 0.78125 v 0.1875 0.15625 0.7734375 v -0.1875 0.15625 0.7734375 v 0.3359375 0.4296875 0.7578125 v -0.3359375 0.4296875 0.7578125 v 0.2734375 0.421875 0.7734375 v -0.2734375 0.421875 0.7734375 v 0.421875 0.3984375 0.7734375 v -0.421875 0.3984375 0.7734375 v 0.5625 0.3515625 0.6953125 v -0.5625 0.3515625 0.6953125 v 0.5859375 0.2890625 0.6875 v -0.5859375 0.2890625 0.6875 v 0.578125 0.1953125 0.6796875 v -0.578125 0.1953125 0.6796875 v 0.4765625 0.1015625 0.71875 v -0.4765625 0.1015625 0.71875 v 0.375 0.0625 0.7421875 v -0.375 0.0625 0.7421875 v 0.2265625 0.109375 0.78125 v -0.2265625 0.109375 0.78125 v 0.1796875 0.296875 0.78125 v -0.1796875 0.296875 0.78125 v 0.2109375 0.375 0.78125 v -0.2109375 0.375 0.78125 v 0.234375 0.359375 0.7578125 v -0.234375 0.359375 0.7578125 v 0.1953125 0.296875 0.7578125 v -0.1953125 0.296875 0.7578125 v 0.2421875 0.125 0.7578125 v -0.2421875 0.125 0.7578125 v 0.375 0.0859375 0.7265625 v -0.375 0.0859375 0.7265625 v 0.4609375 0.1171875 0.703125 v -0.4609375 0.1171875 0.703125 v 0.546875 0.2109375 0.671875 v -0.546875 0.2109375 0.671875 v 0.5546875 0.28125 0.671875 v -0.5546875 0.28125 0.671875 v 0.53125 0.3359375 0.6796875 v -0.53125 0.3359375 0.6796875 v 0.4140625 0.390625 0.75 v -0.4140625 0.390625 0.75 v 0.28125 0.3984375 0.765625 v -0.28125 0.3984375 0.765625 v 0.3359375 0.40625 0.75 v -0.3359375 0.40625 0.75 v 0.203125 0.171875 0.75 v -0.203125 0.171875 0.75 v 0.1953125 0.2265625 0.75 v -0.1953125 0.2265625 0.75 v 0.109375 0.4609375 0.609375 v -0.109375 0.4609375 0.609375 v 0.1953125 0.6640625 0.6171875 v -0.1953125 0.6640625 0.6171875 v 0.3359375 0.6875 0.59375 v -0.3359375 0.6875 0.59375 v 0.484375 0.5546875 0.5546875 v -0.484375 0.5546875 0.5546875 v 0.6796875 0.453125 0.4921875 v -0.6796875 0.453125 0.4921875 v 0.796875 0.40625 0.4609375 v -0.796875 0.40625 0.4609375 v 0.7734375 0.1640625 0.375 v -0.7734375 0.1640625 0.375 v 0.6015625 0.0 0.4140625 v -0.6015625 0.0 0.4140625 v 0.4375 -0.09375 0.46875 v -0.4375 -0.09375 0.46875 v 0.0 0.8984375 0.2890625 v 0.0 0.984375 -0.078125 v 0.0 -0.1953125 -0.671875 v 0.0 -0.4609375 0.1875 v 0.0 -0.9765625 0.4609375 v 0.0 -0.8046875 0.34375 v 0.0 -0.5703125 0.3203125 v 0.0 -0.484375 0.28125 v 0.8515625 0.234375 0.0546875 v -0.8515625 0.234375 0.0546875 v 0.859375 0.3203125 -0.046875 v -0.859375 0.3203125 -0.046875 v 0.7734375 0.265625 -0.4375 v -0.7734375 0.265625 -0.4375 v 0.4609375 0.4375 -0.703125 v -0.4609375 0.4375 -0.703125 v 0.734375 -0.046875 0.0703125 v -0.734375 -0.046875 0.0703125 v 0.59375 -0.125 -0.1640625 v -0.59375 -0.125 -0.1640625 v 0.640625 -0.0078125 -0.4296875 v -0.640625 -0.0078125 -0.4296875 v 0.3359375 0.0546875 -0.6640625 v -0.3359375 0.0546875 -0.6640625 v 0.234375 -0.3515625 0.40625 v -0.234375 -0.3515625 0.40625 v 0.1796875 -0.4140625 0.2578125 v -0.1796875 -0.4140625 0.2578125 v 0.2890625 -0.7109375 0.3828125 v -0.2890625 -0.7109375 0.3828125 v 0.25 -0.5 0.390625 v -0.25 -0.5 0.390625 v 0.328125 -0.9140625 0.3984375 v -0.328125 -0.9140625 0.3984375 v 0.140625 -0.7578125 0.3671875 v -0.140625 -0.7578125 0.3671875 v 0.125 -0.5390625 0.359375 v -0.125 -0.5390625 0.359375 v 0.1640625 -0.9453125 0.4375 v -0.1640625 -0.9453125 0.4375 v 0.21875 -0.28125 0.4296875 v -0.21875 -0.28125 0.4296875 v 0.2109375 -0.2265625 0.46875 v -0.2109375 -0.2265625 0.46875 v 0.203125 -0.171875 0.5 v -0.203125 -0.171875 0.5 v 0.2109375 -0.390625 0.1640625 v -0.2109375 -0.390625 0.1640625 v 0.296875 -0.3125 -0.265625 v -0.296875 -0.3125 -0.265625 v 0.34375 -0.1484375 -0.5390625 v -0.34375 -0.1484375 -0.5390625 v 0.453125 0.8671875 -0.3828125 v -0.453125 0.8671875 -0.3828125 v 0.453125 0.9296875 -0.0703125 v -0.453125 0.9296875 -0.0703125 v 0.453125 0.8515625 0.234375 v -0.453125 0.8515625 0.234375 v 0.4609375 0.5234375 0.4296875 v -0.4609375 0.5234375 0.4296875 v 0.7265625 0.40625 0.3359375 v -0.7265625 0.40625 0.3359375 v 0.6328125 0.453125 0.28125 v -0.6328125 0.453125 0.28125 v 0.640625 0.703125 0.0546875 v -0.640625 0.703125 0.0546875 v 0.796875 0.5625 0.125 v -0.796875 0.5625 0.125 v 0.796875 0.6171875 -0.1171875 v -0.796875 0.6171875 -0.1171875 v 0.640625 0.75 -0.1953125 v -0.640625 0.75 -0.1953125 v 0.640625 0.6796875 -0.4453125 v -0.640625 0.6796875 -0.4453125 v 0.796875 0.5390625 -0.359375 v -0.796875 0.5390625 -0.359375 v 0.6171875 0.328125 -0.5859375 v -0.6171875 0.328125 -0.5859375 v 0.484375 0.0234375 -0.546875 v -0.484375 0.0234375 -0.546875 v 0.8203125 0.328125 -0.203125 v -0.8203125 0.328125 -0.203125 v 0.40625 -0.171875 0.1484375 v -0.40625 -0.171875 0.1484375 v 0.4296875 -0.1953125 -0.2109375 v -0.4296875 -0.1953125 -0.2109375 v 0.890625 0.40625 -0.234375 v -0.890625 0.40625 -0.234375 v 0.7734375 -0.140625 -0.125 v -0.7734375 -0.140625 -0.125 v 1.0390625 -0.1015625 -0.328125 v -1.0390625 -0.1015625 -0.328125 v 1.28125 0.0546875 -0.4296875 v -1.28125 0.0546875 -0.4296875 v 1.3515625 0.3203125 -0.421875 v -1.3515625 0.3203125 -0.421875 v 1.234375 0.5078125 -0.421875 v -1.234375 0.5078125 -0.421875 v 1.0234375 0.4765625 -0.3125 v -1.0234375 0.4765625 -0.3125 v 1.015625 0.4140625 -0.2890625 v -1.015625 0.4140625 -0.2890625 v 1.1875 0.4375 -0.390625 v -1.1875 0.4375 -0.390625 v 1.265625 0.2890625 -0.40625 v -1.265625 0.2890625 -0.40625 v 1.2109375 0.078125 -0.40625 v -1.2109375 0.078125 -0.40625 v 1.03125 -0.0390625 -0.3046875 v -1.03125 -0.0390625 -0.3046875 v 0.828125 -0.0703125 -0.1328125 v -0.828125 -0.0703125 -0.1328125 v 0.921875 0.359375 -0.21875 v -0.921875 0.359375 -0.21875 v 0.9453125 0.3046875 -0.2890625 v -0.9453125 0.3046875 -0.2890625 v 0.8828125 -0.0234375 -0.2109375 v -0.8828125 -0.0234375 -0.2109375 v 1.0390625 0.0 -0.3671875 v -1.0390625 0.0 -0.3671875 v 1.1875 0.09375 -0.4453125 v -1.1875 0.09375 -0.4453125 v 1.234375 0.25 -0.4453125 v -1.234375 0.25 -0.4453125 v 1.171875 0.359375 -0.4375 v -1.171875 0.359375 -0.4375 v 1.0234375 0.34375 -0.359375 v -1.0234375 0.34375 -0.359375 v 0.84375 0.2890625 -0.2109375 v -0.84375 0.2890625 -0.2109375 v 0.8359375 0.171875 -0.2734375 v -0.8359375 0.171875 -0.2734375 v 0.7578125 0.09375 -0.2734375 v -0.7578125 0.09375 -0.2734375 v 0.8203125 0.0859375 -0.2734375 v -0.8203125 0.0859375 -0.2734375 v 0.84375 0.015625 -0.2734375 v -0.84375 0.015625 -0.2734375 v 0.8125 -0.015625 -0.2734375 v -0.8125 -0.015625 -0.2734375 v 0.7265625 0.0 -0.0703125 v -0.7265625 0.0 -0.0703125 v 0.71875 -0.0234375 -0.171875 v -0.71875 -0.0234375 -0.171875 v 0.71875 0.0390625 -0.1875 v -0.71875 0.0390625 -0.1875 v 0.796875 0.203125 -0.2109375 v -0.796875 0.203125 -0.2109375 v 0.890625 0.2421875 -0.265625 v -0.890625 0.2421875 -0.265625 v 0.890625 0.234375 -0.3203125 v -0.890625 0.234375 -0.3203125 v 0.8125 -0.015625 -0.3203125 v -0.8125 -0.015625 -0.3203125 v 0.8515625 0.015625 -0.3203125 v -0.8515625 0.015625 -0.3203125 v 0.828125 0.078125 -0.3203125 v -0.828125 0.078125 -0.3203125 v 0.765625 0.09375 -0.3203125 v -0.765625 0.09375 -0.3203125 v 0.84375 0.171875 -0.3203125 v -0.84375 0.171875 -0.3203125 v 1.0390625 0.328125 -0.4140625 v -1.0390625 0.328125 -0.4140625 v 1.1875 0.34375 -0.484375 v -1.1875 0.34375 -0.484375 v 1.2578125 0.2421875 -0.4921875 v -1.2578125 0.2421875 -0.4921875 v 1.2109375 0.0859375 -0.484375 v -1.2109375 0.0859375 -0.484375 v 1.046875 0.0 -0.421875 v -1.046875 0.0 -0.421875 v 0.8828125 -0.015625 -0.265625 v -0.8828125 -0.015625 -0.265625 v 0.953125 0.2890625 -0.34375 v -0.953125 0.2890625 -0.34375 v 0.890625 0.109375 -0.328125 v -0.890625 0.109375 -0.328125 v 0.9375 0.0625 -0.3359375 v -0.9375 0.0625 -0.3359375 v 1.0 0.125 -0.3671875 v -1.0 0.125 -0.3671875 v 0.9609375 0.171875 -0.3515625 v -0.9609375 0.171875 -0.3515625 v 1.015625 0.234375 -0.375 v -1.015625 0.234375 -0.375 v 1.0546875 0.1875 -0.3828125 v -1.0546875 0.1875 -0.3828125 v 1.109375 0.2109375 -0.390625 v -1.109375 0.2109375 -0.390625 v 1.0859375 0.2734375 -0.390625 v -1.0859375 0.2734375 -0.390625 v 1.0234375 0.4375 -0.484375 v -1.0234375 0.4375 -0.484375 v 1.25 0.46875 -0.546875 v -1.25 0.46875 -0.546875 v 1.3671875 0.296875 -0.5 v -1.3671875 0.296875 -0.5 v 1.3125 0.0546875 -0.53125 v -1.3125 0.0546875 -0.53125 v 1.0390625 -0.0859375 -0.4921875 v -1.0390625 -0.0859375 -0.4921875 v 0.7890625 -0.125 -0.328125 v -0.7890625 -0.125 -0.328125 v 0.859375 0.3828125 -0.3828125 v -0.859375 0.3828125 -0.3828125 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vn 0.183602273464 -0.00531030492857 0.982986271381 vn -0.11484221369 0.360335379839 0.925726532936 vn -0.394005328417 0.0176402088255 0.918938875198 vn 0.394005328417 0.0176402088255 0.918938875198 vn 0.11484221369 0.360335379839 0.925726532936 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.210918188095 0.408316344023 0.888139247894 vn -0.11484221369 0.360335379839 0.925726532936 vn 0.183602273464 -0.00531030492857 0.982986271381 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.11484221369 0.360335379839 0.925726532936 vn -0.210918188095 0.408316344023 0.888139247894 vn 0.183602273464 -0.00531030492857 0.982986271381 vn 0.430170893669 0.299425840378 0.851643800735 vn 0.210918188095 0.408316344023 0.888139247894 vn -0.210918188095 0.408316344023 0.888139247894 vn -0.430170893669 0.299425840378 0.851643800735 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.183602273464 -0.00531030492857 0.982986271381 vn 0.474120676517 0.0148019650951 0.880335450172 vn 0.430170893669 0.299425840378 0.851643800735 vn -0.430170893669 0.299425840378 0.851643800735 vn -0.474120676517 0.0148019650951 0.880335450172 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.183602273464 -0.00531030492857 0.982986271381 vn 0.431019723415 -0.307906121016 0.848183810711 vn 0.474120676517 0.0148019650951 0.880335450172 vn -0.474120676517 0.0148019650951 0.880335450172 vn -0.431019723415 -0.307906121016 0.848183810711 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.183602273464 -0.00531030492857 0.982986271381 vn 0.218181833625 -0.40648534894 0.887223958969 vn 0.431019723415 -0.307906121016 0.848183810711 vn -0.431019723415 -0.307906121016 0.848183810711 vn -0.218181833625 -0.40648534894 0.887223958969 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.183602273464 -0.00531030492857 0.982986271381 vn -0.125890552998 -0.366288095713 0.921946108341 vn 0.218181833625 -0.40648534894 0.887223958969 vn -0.218181833625 -0.40648534894 0.887223958969 vn 0.125890552998 -0.366288095713 0.921946108341 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.183602273464 -0.00531030492857 0.982986271381 vn -0.394005328417 0.0176402088255 0.918938875198 vn -0.125890552998 -0.366288095713 0.921946108341 vn 0.125890552998 -0.366288095713 0.921946108341 vn 0.394005328417 0.0176402088255 0.918938875198 vn -0.183602273464 -0.00531030492857 0.982986271381 vn 0.737654030323 -0.555666804314 0.383537381887 vn 0.349170416594 -0.837844192982 0.419639289379 vn 0.713866174221 -0.503255724907 0.486958652735 vn -0.713866174221 -0.503255724907 0.486958652735 vn -0.349170416594 -0.837844192982 0.419639289379 vn -0.737654030323 -0.555666804314 0.383537381887 vn 0.0 0.859208881855 0.511624991894 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.500936388969 0.865484118462 vn 0.0 0.500936388969 0.865484118462 vn -0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.859208881855 0.511624991894 vn 0.98409897089 -0.160959467292 0.0751083120704 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.58612203598 -0.795209348202 0.155251383781 vn -0.58612203598 -0.795209348202 0.155251383781 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.98409897089 -0.160959467292 0.0751083120704 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.752599895 -0.591123640537 0.290114164352 vn -0.213936015964 -0.600852012634 0.770200133324 vn 0.213936015964 -0.600852012634 0.770200133324 vn -0.752599895 -0.591123640537 0.290114164352 vn -0.457334339619 -0.873711526394 -0.165751263499 vn 0.440368294716 -0.32085326314 -0.838527858257 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.526461541653 -0.659373998642 -0.536716103554 vn -0.526461541653 -0.659373998642 -0.536716103554 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.440368294716 -0.32085326314 -0.838527858257 vn 0.969437777996 -0.207865297794 -0.130316376686 vn 0.360676318407 0.617800891399 0.698737919331 vn 0.945388555527 -0.0795631557703 0.316085785627 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.360676318407 0.617800891399 0.698737919331 vn -0.969437777996 -0.207865297794 -0.130316376686 vn -0.0794406458735 0.942056834698 0.325911164284 vn 0.292193770409 0.324330806732 0.899684548378 vn 0.762095272541 0.241651132703 0.600679218769 vn -0.762095272541 0.241651132703 0.600679218769 vn -0.292193770409 0.324330806732 0.899684548378 vn 0.0794406458735 0.942056834698 0.325911164284 vn 0.268936276436 0.6083111763 -0.746746838093 vn 0.923995316029 0.0860027298331 -0.372607320547 vn -0.558695197105 0.366664707661 -0.743919789791 vn 0.558695197105 0.366664707661 -0.743919789791 vn -0.923995316029 0.0860027298331 -0.372607320547 vn -0.268936276436 0.6083111763 -0.746746838093 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn -0.269178330898 -0.631470382214 -0.727178215981 vn -0.291121631861 -0.919296205044 -0.264844685793 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn -0.291121631861 -0.919296205044 -0.264844685793 vn 0.0437948256731 -0.654389321804 -0.754888474941 vn 0.291121631861 -0.919296205044 -0.264844685793 vn 0.269178330898 -0.631470382214 -0.727178215981 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn 0.291121631861 -0.919296205044 -0.264844685793 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn -0.0437948256731 -0.654389321804 -0.754888474941 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn -0.772313654423 -0.590878307819 0.233226165175 vn -0.758853852749 -0.167579576373 -0.629331350327 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.269178330898 -0.631470382214 -0.727178215981 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.772313654423 -0.590878307819 0.233226165175 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn 0.758853852749 -0.167579576373 -0.629331350327 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn 0.269178330898 -0.631470382214 -0.727178215981 vn 0.314834296703 0.77429831028 0.548945784569 vn 0.990731358528 -0.057070132345 -0.123265378177 vn -0.758853852749 -0.167579576373 -0.629331350327 vn 0.314834296703 0.77429831028 0.548945784569 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.772313654423 -0.590878307819 0.233226165175 vn 0.758853852749 -0.167579576373 -0.629331350327 vn -0.990731358528 -0.057070132345 -0.123265378177 vn -0.314834296703 0.77429831028 0.548945784569 vn 0.758853852749 -0.167579576373 -0.629331350327 vn -0.314834296703 0.77429831028 0.548945784569 vn 0.772313654423 -0.590878307819 0.233226165175 vn 0.558695197105 0.366664707661 -0.743919789791 vn -0.268936276436 0.6083111763 -0.746746838093 vn 0.415765762329 0.56610429287 -0.711803853512 vn 0.558695197105 0.366664707661 -0.743919789791 vn 0.415765762329 0.56610429287 -0.711803853512 vn 0.515473604202 0.620857298374 -0.590612530708 vn -0.415765762329 0.56610429287 -0.711803853512 vn 0.268936276436 0.6083111763 -0.746746838093 vn -0.558695197105 0.366664707661 -0.743919789791 vn -0.415765762329 0.56610429287 -0.711803853512 vn -0.558695197105 0.366664707661 -0.743919789791 vn -0.515473604202 0.620857298374 -0.590612530708 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn 0.515473604202 0.620857298374 -0.590612530708 vn 0.415765762329 0.56610429287 -0.711803853512 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn 0.415765762329 0.56610429287 -0.711803853512 vn -0.772313654423 -0.590878307819 0.233226165175 vn -0.415765762329 0.56610429287 -0.711803853512 vn -0.515473604202 0.620857298374 -0.590612530708 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn -0.415765762329 0.56610429287 -0.711803853512 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn 0.772313654423 -0.590878307819 0.233226165175 vn 0.415765762329 0.56610429287 -0.711803853512 vn 0.578987181187 0.430631458759 -0.692336916924 vn 0.314834296703 0.77429831028 0.548945784569 vn 0.415765762329 0.56610429287 -0.711803853512 vn 0.314834296703 0.77429831028 0.548945784569 vn -0.772313654423 -0.590878307819 0.233226165175 vn -0.314834296703 0.77429831028 0.548945784569 vn -0.578987181187 0.430631458759 -0.692336916924 vn -0.415765762329 0.56610429287 -0.711803853512 vn -0.314834296703 0.77429831028 0.548945784569 vn -0.415765762329 0.56610429287 -0.711803853512 vn 0.772313654423 -0.590878307819 0.233226165175 vn -0.268936276436 0.6083111763 -0.746746838093 vn 0.0866444334388 0.680886685848 -0.727245509624 vn 0.578987181187 0.430631458759 -0.692336916924 vn -0.268936276436 0.6083111763 -0.746746838093 vn 0.578987181187 0.430631458759 -0.692336916924 vn 0.415765762329 0.56610429287 -0.711803853512 vn -0.578987181187 0.430631458759 -0.692336916924 vn -0.0866444334388 0.680886685848 -0.727245509624 vn 0.268936276436 0.6083111763 -0.746746838093 vn -0.578987181187 0.430631458759 -0.692336916924 vn 0.268936276436 0.6083111763 -0.746746838093 vn -0.415765762329 0.56610429287 -0.711803853512 vn -0.923995316029 0.0860027298331 -0.372607320547 vn -0.762606561184 0.175117522478 0.622707903385 vn 0.0866444334388 0.680886685848 -0.727245509624 vn -0.923995316029 0.0860027298331 -0.372607320547 vn 0.0866444334388 0.680886685848 -0.727245509624 vn -0.268936276436 0.6083111763 -0.746746838093 vn -0.0866444334388 0.680886685848 -0.727245509624 vn 0.762606561184 0.175117522478 0.622707903385 vn 0.923995316029 0.0860027298331 -0.372607320547 vn -0.0866444334388 0.680886685848 -0.727245509624 vn 0.923995316029 0.0860027298331 -0.372607320547 vn 0.268936276436 0.6083111763 -0.746746838093 vn 0.558695197105 0.366664707661 -0.743919789791 vn -0.661450505257 -0.479004502296 0.577094376087 vn -0.762606561184 0.175117522478 0.622707903385 vn 0.558695197105 0.366664707661 -0.743919789791 vn -0.762606561184 0.175117522478 0.622707903385 vn -0.923995316029 0.0860027298331 -0.372607320547 vn 0.762606561184 0.175117522478 0.622707903385 vn 0.661450505257 -0.479004502296 0.577094376087 vn -0.558695197105 0.366664707661 -0.743919789791 vn 0.762606561184 0.175117522478 0.622707903385 vn -0.558695197105 0.366664707661 -0.743919789791 vn 0.923995316029 0.0860027298331 -0.372607320547 vn 0.515473604202 0.620857298374 -0.590612530708 vn -0.485469311476 -0.792858958244 0.368367046118 vn -0.661450505257 -0.479004502296 0.577094376087 vn 0.515473604202 0.620857298374 -0.590612530708 vn -0.661450505257 -0.479004502296 0.577094376087 vn 0.558695197105 0.366664707661 -0.743919789791 vn 0.661450505257 -0.479004502296 0.577094376087 vn 0.485469311476 -0.792858958244 0.368367046118 vn -0.515473604202 0.620857298374 -0.590612530708 vn 0.661450505257 -0.479004502296 0.577094376087 vn -0.515473604202 0.620857298374 -0.590612530708 vn -0.558695197105 0.366664707661 -0.743919789791 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn 0.0437948256731 -0.654389321804 -0.754888474941 vn -0.485469311476 -0.792858958244 0.368367046118 vn 0.0977837964892 -0.840104401112 -0.533538162708 vn -0.485469311476 -0.792858958244 0.368367046118 vn 0.515473604202 0.620857298374 -0.590612530708 vn 0.485469311476 -0.792858958244 0.368367046118 vn -0.0437948256731 -0.654389321804 -0.754888474941 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn 0.485469311476 -0.792858958244 0.368367046118 vn -0.0977837964892 -0.840104401112 -0.533538162708 vn -0.515473604202 0.620857298374 -0.590612530708 vn -0.475033849478 -0.369040131569 0.798844277859 vn -0.292193770409 0.324330806732 0.899684548378 vn -0.762095272541 0.241651132703 0.600679218769 vn -0.475033849478 -0.369040131569 0.798844277859 vn -0.762095272541 0.241651132703 0.600679218769 vn -0.741546988487 0.0745575428009 0.666745245457 vn 0.762095272541 0.241651132703 0.600679218769 vn 0.292193770409 0.324330806732 0.899684548378 vn 0.475033849478 -0.369040131569 0.798844277859 vn 0.762095272541 0.241651132703 0.600679218769 vn 0.475033849478 -0.369040131569 0.798844277859 vn 0.741546988487 0.0745575428009 0.666745245457 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.475033849478 -0.369040131569 0.798844277859 vn -0.741546988487 0.0745575428009 0.666745245457 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.741546988487 0.0745575428009 0.666745245457 vn -0.647530972958 -0.283556103706 0.707318544388 vn 0.741546988487 0.0745575428009 0.666745245457 vn 0.475033849478 -0.369040131569 0.798844277859 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.741546988487 0.0745575428009 0.666745245457 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.647530972958 -0.283556103706 0.707318544388 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.647530972958 -0.283556103706 0.707318544388 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.647530972958 -0.283556103706 0.707318544388 vn -0.556803405285 -0.628921687603 0.542611718178 vn 0.647530972958 -0.283556103706 0.707318544388 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.647530972958 -0.283556103706 0.707318544388 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.556803405285 -0.628921687603 0.542611718178 vn -0.397539019585 0.146399110556 0.905831098557 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.556803405285 -0.628921687603 0.542611718178 vn -0.397539019585 0.146399110556 0.905831098557 vn -0.556803405285 -0.628921687603 0.542611718178 vn 0.020142596215 0.952195465565 0.304824620485 vn 0.556803405285 -0.628921687603 0.542611718178 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.397539019585 0.146399110556 0.905831098557 vn 0.556803405285 -0.628921687603 0.542611718178 vn 0.397539019585 0.146399110556 0.905831098557 vn -0.020142596215 0.952195465565 0.304824620485 vn -0.397539019585 0.146399110556 0.905831098557 vn 0.020142596215 0.952195465565 0.304824620485 vn 0.459103763103 0.884117364883 0.0869498476386 vn -0.397539019585 0.146399110556 0.905831098557 vn 0.459103763103 0.884117364883 0.0869498476386 vn -0.646234750748 -0.358076632023 0.673915266991 vn -0.459103763103 0.884117364883 0.0869498476386 vn -0.020142596215 0.952195465565 0.304824620485 vn 0.397539019585 0.146399110556 0.905831098557 vn -0.459103763103 0.884117364883 0.0869498476386 vn 0.397539019585 0.146399110556 0.905831098557 vn 0.646234750748 -0.358076632023 0.673915266991 vn -0.522433280945 -0.438260436058 0.731431007385 vn -0.208660125732 -0.00756877427921 0.977958917618 vn -0.440944999456 0.387596994638 0.809528291225 vn -0.522433280945 -0.438260436058 0.731431007385 vn -0.440944999456 0.387596994638 0.809528291225 vn 0.247078850865 0.924134731293 0.291422426701 vn 0.440944999456 0.387596994638 0.809528291225 vn 0.208660125732 -0.00756877427921 0.977958917618 vn 0.522433280945 -0.438260436058 0.731431007385 vn 0.440944999456 0.387596994638 0.809528291225 vn 0.522433280945 -0.438260436058 0.731431007385 vn -0.247078850865 0.924134731293 0.291422426701 vn -0.208660125732 -0.00756877427921 0.977958917618 vn -0.522433280945 -0.438260436058 0.731431007385 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.208660125732 -0.00756877427921 0.977958917618 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.354475706816 -0.0199898071587 0.934851527214 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.522433280945 -0.438260436058 0.731431007385 vn 0.208660125732 -0.00756877427921 0.977958917618 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.208660125732 -0.00756877427921 0.977958917618 vn 0.354475706816 -0.0199898071587 0.934851527214 vn -0.319899052382 0.108372591436 0.941233217716 vn -0.354475706816 -0.0199898071587 0.934851527214 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.319899052382 0.108372591436 0.941233217716 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.645799636841 -0.428834110498 0.631699383259 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.354475706816 -0.0199898071587 0.934851527214 vn 0.319899052382 0.108372591436 0.941233217716 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.319899052382 0.108372591436 0.941233217716 vn 0.645799636841 -0.428834110498 0.631699383259 vn -0.319899052382 0.108372591436 0.941233217716 vn -0.645799636841 -0.428834110498 0.631699383259 vn 0.0794406458735 0.942056834698 0.325911164284 vn -0.319899052382 0.108372591436 0.941233217716 vn 0.0794406458735 0.942056834698 0.325911164284 vn -0.292193770409 0.324330806732 0.899684548378 vn -0.0794406458735 0.942056834698 0.325911164284 vn 0.645799636841 -0.428834110498 0.631699383259 vn 0.319899052382 0.108372591436 0.941233217716 vn -0.0794406458735 0.942056834698 0.325911164284 vn 0.319899052382 0.108372591436 0.941233217716 vn 0.292193770409 0.324330806732 0.899684548378 vn -0.475033849478 -0.369040131569 0.798844277859 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.319899052382 0.108372591436 0.941233217716 vn -0.475033849478 -0.369040131569 0.798844277859 vn -0.319899052382 0.108372591436 0.941233217716 vn -0.292193770409 0.324330806732 0.899684548378 vn 0.319899052382 0.108372591436 0.941233217716 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.475033849478 -0.369040131569 0.798844277859 vn 0.319899052382 0.108372591436 0.941233217716 vn 0.475033849478 -0.369040131569 0.798844277859 vn 0.292193770409 0.324330806732 0.899684548378 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.354475706816 -0.0199898071587 0.934851527214 vn -0.345109045506 -0.114415802062 0.931562542915 vn -0.354475706816 -0.0199898071587 0.934851527214 vn -0.319899052382 0.108372591436 0.941233217716 vn 0.354475706816 -0.0199898071587 0.934851527214 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.354475706816 -0.0199898071587 0.934851527214 vn 0.345109045506 -0.114415802062 0.931562542915 vn 0.319899052382 0.108372591436 0.941233217716 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.397539019585 0.146399110556 0.905831098557 vn -0.208660125732 -0.00756877427921 0.977958917618 vn -0.417041838169 -0.0926250964403 0.904155254364 vn -0.208660125732 -0.00756877427921 0.977958917618 vn -0.354475706816 -0.0199898071587 0.934851527214 vn 0.208660125732 -0.00756877427921 0.977958917618 vn 0.397539019585 0.146399110556 0.905831098557 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.208660125732 -0.00756877427921 0.977958917618 vn 0.417041838169 -0.0926250964403 0.904155254364 vn 0.354475706816 -0.0199898071587 0.934851527214 vn -0.397539019585 0.146399110556 0.905831098557 vn -0.646234750748 -0.358076632023 0.673915266991 vn -0.440944999456 0.387596994638 0.809528291225 vn -0.397539019585 0.146399110556 0.905831098557 vn -0.440944999456 0.387596994638 0.809528291225 vn -0.208660125732 -0.00756877427921 0.977958917618 vn 0.440944999456 0.387596994638 0.809528291225 vn 0.646234750748 -0.358076632023 0.673915266991 vn 0.397539019585 0.146399110556 0.905831098557 vn 0.440944999456 0.387596994638 0.809528291225 vn 0.397539019585 0.146399110556 0.905831098557 vn 0.208660125732 -0.00756877427921 0.977958917618 vn -0.556803405285 -0.628921687603 0.542611718178 vn 0.208019003272 0.953786611557 0.216839045286 vn -0.164958000183 0.859460175037 0.48385643959 vn -0.556803405285 -0.628921687603 0.542611718178 vn -0.164958000183 0.859460175037 0.48385643959 vn 0.020142596215 0.952195465565 0.304824620485 vn 0.164958000183 0.859460175037 0.48385643959 vn -0.208019003272 0.953786611557 0.216839045286 vn 0.556803405285 -0.628921687603 0.542611718178 vn 0.164958000183 0.859460175037 0.48385643959 vn 0.556803405285 -0.628921687603 0.542611718178 vn -0.020142596215 0.952195465565 0.304824620485 vn -0.647530972958 -0.283556103706 0.707318544388 vn 0.809712767601 0.584509372711 -0.0520967803895 vn 0.208019003272 0.953786611557 0.216839045286 vn -0.647530972958 -0.283556103706 0.707318544388 vn 0.208019003272 0.953786611557 0.216839045286 vn -0.556803405285 -0.628921687603 0.542611718178 vn -0.208019003272 0.953786611557 0.216839045286 vn -0.809712767601 0.584509372711 -0.0520967803895 vn 0.647530972958 -0.283556103706 0.707318544388 vn -0.208019003272 0.953786611557 0.216839045286 vn 0.647530972958 -0.283556103706 0.707318544388 vn 0.556803405285 -0.628921687603 0.542611718178 vn -0.741546988487 0.0745575428009 0.666745245457 vn 0.988684535027 -0.0798064619303 0.127018928528 vn 0.809712767601 0.584509372711 -0.0520967803895 vn -0.741546988487 0.0745575428009 0.666745245457 vn 0.809712767601 0.584509372711 -0.0520967803895 vn -0.647530972958 -0.283556103706 0.707318544388 vn -0.809712767601 0.584509372711 -0.0520967803895 vn -0.988684535027 -0.0798064619303 0.127018928528 vn 0.741546988487 0.0745575428009 0.666745245457 vn -0.809712767601 0.584509372711 -0.0520967803895 vn 0.741546988487 0.0745575428009 0.666745245457 vn 0.647530972958 -0.283556103706 0.707318544388 vn -0.762095272541 0.241651132703 0.600679218769 vn 0.143197178841 -0.754013121128 0.641060650349 vn 0.988684535027 -0.0798064619303 0.127018928528 vn -0.762095272541 0.241651132703 0.600679218769 vn 0.988684535027 -0.0798064619303 0.127018928528 vn -0.741546988487 0.0745575428009 0.666745245457 vn -0.988684535027 -0.0798064619303 0.127018928528 vn -0.143197178841 -0.754013121128 0.641060650349 vn 0.762095272541 0.241651132703 0.600679218769 vn -0.988684535027 -0.0798064619303 0.127018928528 vn 0.762095272541 0.241651132703 0.600679218769 vn 0.741546988487 0.0745575428009 0.666745245457 vn 0.0794406458735 0.942056834698 0.325911164284 vn -0.547202169895 -0.673244833946 0.497303903103 vn 0.143197178841 -0.754013121128 0.641060650349 vn 0.0794406458735 0.942056834698 0.325911164284 vn 0.143197178841 -0.754013121128 0.641060650349 vn -0.762095272541 0.241651132703 0.600679218769 vn -0.143197178841 -0.754013121128 0.641060650349 vn 0.547202169895 -0.673244833946 0.497303903103 vn -0.0794406458735 0.942056834698 0.325911164284 vn -0.143197178841 -0.754013121128 0.641060650349 vn -0.0794406458735 0.942056834698 0.325911164284 vn 0.762095272541 0.241651132703 0.600679218769 vn -0.645799636841 -0.428834110498 0.631699383259 vn -0.7127789855 -0.548462927341 0.437189429998 vn -0.547202169895 -0.673244833946 0.497303903103 vn -0.645799636841 -0.428834110498 0.631699383259 vn -0.547202169895 -0.673244833946 0.497303903103 vn 0.0794406458735 0.942056834698 0.325911164284 vn 0.547202169895 -0.673244833946 0.497303903103 vn 0.7127789855 -0.548462927341 0.437189429998 vn 0.645799636841 -0.428834110498 0.631699383259 vn 0.547202169895 -0.673244833946 0.497303903103 vn 0.645799636841 -0.428834110498 0.631699383259 vn -0.0794406458735 0.942056834698 0.325911164284 vn 0.020142596215 0.952195465565 0.304824620485 vn -0.164958000183 0.859460175037 0.48385643959 vn 0.353290885687 0.933309316635 -0.0641819909215 vn 0.020142596215 0.952195465565 0.304824620485 vn 0.353290885687 0.933309316635 -0.0641819909215 vn 0.459103763103 0.884117364883 0.0869498476386 vn -0.353290885687 0.933309316635 -0.0641819909215 vn 0.164958000183 0.859460175037 0.48385643959 vn -0.020142596215 0.952195465565 0.304824620485 vn -0.353290885687 0.933309316635 -0.0641819909215 vn -0.020142596215 0.952195465565 0.304824620485 vn -0.459103763103 0.884117364883 0.0869498476386 vn 0.459103763103 0.884117364883 0.0869498476386 vn 0.353290885687 0.933309316635 -0.0641819909215 vn -0.866343021393 -0.159522846341 0.473288744688 vn 0.459103763103 0.884117364883 0.0869498476386 vn -0.866343021393 -0.159522846341 0.473288744688 vn -0.646234750748 -0.358076632023 0.673915266991 vn 0.866343021393 -0.159522846341 0.473288744688 vn -0.353290885687 0.933309316635 -0.0641819909215 vn -0.459103763103 0.884117364883 0.0869498476386 vn 0.866343021393 -0.159522846341 0.473288744688 vn -0.459103763103 0.884117364883 0.0869498476386 vn 0.646234750748 -0.358076632023 0.673915266991 vn -0.646234750748 -0.358076632023 0.673915266991 vn -0.866343021393 -0.159522846341 0.473288744688 vn -0.441643774509 0.645451188087 -0.623172163963 vn -0.646234750748 -0.358076632023 0.673915266991 vn -0.441643774509 0.645451188087 -0.623172163963 vn -0.440944999456 0.387596994638 0.809528291225 vn 0.441643774509 0.645451188087 -0.623172163963 vn 0.866343021393 -0.159522846341 0.473288744688 vn 0.646234750748 -0.358076632023 0.673915266991 vn 0.441643774509 0.645451188087 -0.623172163963 vn 0.646234750748 -0.358076632023 0.673915266991 vn 0.440944999456 0.387596994638 0.809528291225 vn -0.440944999456 0.387596994638 0.809528291225 vn -0.441643774509 0.645451188087 -0.623172163963 vn 0.284412443638 0.910431146622 0.300374239683 vn -0.440944999456 0.387596994638 0.809528291225 vn 0.284412443638 0.910431146622 0.300374239683 vn 0.247078850865 0.924134731293 0.291422426701 vn -0.284412443638 0.910431146622 0.300374239683 vn 0.441643774509 0.645451188087 -0.623172163963 vn 0.440944999456 0.387596994638 0.809528291225 vn -0.284412443638 0.910431146622 0.300374239683 vn 0.440944999456 0.387596994638 0.809528291225 vn -0.247078850865 0.924134731293 0.291422426701 vn 0.247078850865 0.924134731293 0.291422426701 vn 0.284412443638 0.910431146622 0.300374239683 vn -0.746562004089 -0.565949082375 0.349781155586 vn 0.247078850865 0.924134731293 0.291422426701 vn -0.746562004089 -0.565949082375 0.349781155586 vn -0.522433280945 -0.438260436058 0.731431007385 vn 0.746562004089 -0.565949082375 0.349781155586 vn -0.284412443638 0.910431146622 0.300374239683 vn -0.247078850865 0.924134731293 0.291422426701 vn 0.746562004089 -0.565949082375 0.349781155586 vn -0.247078850865 0.924134731293 0.291422426701 vn 0.522433280945 -0.438260436058 0.731431007385 vn -0.522433280945 -0.438260436058 0.731431007385 vn -0.746562004089 -0.565949082375 0.349781155586 vn -0.68150472641 -0.555397331715 0.476534485817 vn -0.522433280945 -0.438260436058 0.731431007385 vn -0.68150472641 -0.555397331715 0.476534485817 vn -0.6761931777 -0.434508144855 0.594949960709 vn 0.68150472641 -0.555397331715 0.476534485817 vn 0.746562004089 -0.565949082375 0.349781155586 vn 0.522433280945 -0.438260436058 0.731431007385 vn 0.68150472641 -0.555397331715 0.476534485817 vn 0.522433280945 -0.438260436058 0.731431007385 vn 0.6761931777 -0.434508144855 0.594949960709 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.68150472641 -0.555397331715 0.476534485817 vn -0.7127789855 -0.548462927341 0.437189429998 vn -0.6761931777 -0.434508144855 0.594949960709 vn -0.7127789855 -0.548462927341 0.437189429998 vn -0.645799636841 -0.428834110498 0.631699383259 vn 0.7127789855 -0.548462927341 0.437189429998 vn 0.68150472641 -0.555397331715 0.476534485817 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.7127789855 -0.548462927341 0.437189429998 vn 0.6761931777 -0.434508144855 0.594949960709 vn 0.645799636841 -0.428834110498 0.631699383259 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.969437777996 -0.207865297794 -0.130316376686 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.853240609169 -0.408445775509 0.324272304773 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.969437777996 -0.207865297794 -0.130316376686 vn 0.945388555527 -0.0795631557703 0.316085785627 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.945388555527 -0.0795631557703 0.316085785627 vn 0.853240609169 -0.408445775509 0.324272304773 vn -0.772320747375 -0.265365093946 0.577149987221 vn -0.853240609169 -0.408445775509 0.324272304773 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.772320747375 -0.265365093946 0.577149987221 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.990731358528 -0.057070132345 -0.123265378177 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.853240609169 -0.408445775509 0.324272304773 vn 0.772320747375 -0.265365093946 0.577149987221 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.772320747375 -0.265365093946 0.577149987221 vn -0.990731358528 -0.057070132345 -0.123265378177 vn -0.68150472641 -0.555397331715 0.476534485817 vn -0.772320747375 -0.265365093946 0.577149987221 vn -0.441982060671 -0.0220960509032 0.896751701832 vn -0.68150472641 -0.555397331715 0.476534485817 vn -0.441982060671 -0.0220960509032 0.896751701832 vn -0.7127789855 -0.548462927341 0.437189429998 vn 0.441982060671 -0.0220960509032 0.896751701832 vn 0.772320747375 -0.265365093946 0.577149987221 vn 0.68150472641 -0.555397331715 0.476534485817 vn 0.441982060671 -0.0220960509032 0.896751701832 vn 0.68150472641 -0.555397331715 0.476534485817 vn 0.7127789855 -0.548462927341 0.437189429998 vn -0.746562004089 -0.565949082375 0.349781155586 vn -0.853240609169 -0.408445775509 0.324272304773 vn -0.772320747375 -0.265365093946 0.577149987221 vn -0.746562004089 -0.565949082375 0.349781155586 vn -0.772320747375 -0.265365093946 0.577149987221 vn -0.68150472641 -0.555397331715 0.476534485817 vn 0.772320747375 -0.265365093946 0.577149987221 vn 0.853240609169 -0.408445775509 0.324272304773 vn 0.746562004089 -0.565949082375 0.349781155586 vn 0.772320747375 -0.265365093946 0.577149987221 vn 0.746562004089 -0.565949082375 0.349781155586 vn 0.68150472641 -0.555397331715 0.476534485817 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.853240609169 -0.408445775509 0.324272304773 vn -0.746562004089 -0.565949082375 0.349781155586 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.746562004089 -0.565949082375 0.349781155586 vn 0.284412443638 0.910431146622 0.300374239683 vn 0.746562004089 -0.565949082375 0.349781155586 vn 0.853240609169 -0.408445775509 0.324272304773 vn 0.945388555527 -0.0795631557703 0.316085785627 vn 0.746562004089 -0.565949082375 0.349781155586 vn 0.945388555527 -0.0795631557703 0.316085785627 vn -0.284412443638 0.910431146622 0.300374239683 vn -0.866343021393 -0.159522846341 0.473288744688 vn -0.945388555527 -0.0795631557703 0.316085785627 vn 0.284412443638 0.910431146622 0.300374239683 vn -0.866343021393 -0.159522846341 0.473288744688 vn 0.284412443638 0.910431146622 0.300374239683 vn -0.441643774509 0.645451188087 -0.623172163963 vn -0.284412443638 0.910431146622 0.300374239683 vn 0.945388555527 -0.0795631557703 0.316085785627 vn 0.866343021393 -0.159522846341 0.473288744688 vn -0.284412443638 0.910431146622 0.300374239683 vn 0.866343021393 -0.159522846341 0.473288744688 vn 0.441643774509 0.645451188087 -0.623172163963 vn -0.360676318407 0.617800891399 0.698737919331 vn -0.945388555527 -0.0795631557703 0.316085785627 vn -0.866343021393 -0.159522846341 0.473288744688 vn -0.360676318407 0.617800891399 0.698737919331 vn -0.866343021393 -0.159522846341 0.473288744688 vn 0.353290885687 0.933309316635 -0.0641819909215 vn 0.866343021393 -0.159522846341 0.473288744688 vn 0.945388555527 -0.0795631557703 0.316085785627 vn 0.360676318407 0.617800891399 0.698737919331 vn 0.866343021393 -0.159522846341 0.473288744688 vn 0.360676318407 0.617800891399 0.698737919331 vn -0.353290885687 0.933309316635 -0.0641819909215 vn 0.353290885687 0.933309316635 -0.0641819909215 vn -0.164958000183 0.859460175037 0.48385643959 vn -0.337028026581 0.31645783782 0.886716723442 vn 0.353290885687 0.933309316635 -0.0641819909215 vn -0.337028026581 0.31645783782 0.886716723442 vn -0.360676318407 0.617800891399 0.698737919331 vn 0.337028026581 0.31645783782 0.886716723442 vn 0.164958000183 0.859460175037 0.48385643959 vn -0.353290885687 0.933309316635 -0.0641819909215 vn 0.337028026581 0.31645783782 0.886716723442 vn -0.353290885687 0.933309316635 -0.0641819909215 vn 0.360676318407 0.617800891399 0.698737919331 vn -0.441982060671 -0.0220960509032 0.896751701832 vn -0.772320747375 -0.265365093946 0.577149987221 vn 0.990731358528 -0.057070132345 -0.123265378177 vn -0.441982060671 -0.0220960509032 0.896751701832 vn 0.990731358528 -0.057070132345 -0.123265378177 vn 0.314834296703 0.77429831028 0.548945784569 vn -0.990731358528 -0.057070132345 -0.123265378177 vn 0.772320747375 -0.265365093946 0.577149987221 vn 0.441982060671 -0.0220960509032 0.896751701832 vn -0.990731358528 -0.057070132345 -0.123265378177 vn 0.441982060671 -0.0220960509032 0.896751701832 vn -0.314834296703 0.77429831028 0.548945784569 vn -0.969437777996 -0.207865297794 -0.130316376686 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.969437777996 -0.207865297794 -0.130316376686 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.969437777996 -0.207865297794 -0.130316376686 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.969437777996 -0.207865297794 -0.130316376686 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.337028026581 0.31645783782 0.886716723442 vn 0.0437948256731 -0.654389321804 -0.754888474941 vn -0.291121631861 -0.919296205044 -0.264844685793 vn -0.337028026581 0.31645783782 0.886716723442 vn -0.291121631861 -0.919296205044 -0.264844685793 vn -0.360676318407 0.617800891399 0.698737919331 vn 0.291121631861 -0.919296205044 -0.264844685793 vn -0.0437948256731 -0.654389321804 -0.754888474941 vn 0.337028026581 0.31645783782 0.886716723442 vn 0.291121631861 -0.919296205044 -0.264844685793 vn 0.337028026581 0.31645783782 0.886716723442 vn 0.360676318407 0.617800891399 0.698737919331 vn -0.360676318407 0.617800891399 0.698737919331 vn -0.291121631861 -0.919296205044 -0.264844685793 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.360676318407 0.617800891399 0.698737919331 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.969437777996 -0.207865297794 -0.130316376686 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.291121631861 -0.919296205044 -0.264844685793 vn 0.360676318407 0.617800891399 0.698737919331 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.360676318407 0.617800891399 0.698737919331 vn 0.969437777996 -0.207865297794 -0.130316376686 vn -0.7127789855 -0.548462927341 0.437189429998 vn -0.441982060671 -0.0220960509032 0.896751701832 vn -0.582065582275 -0.102484077215 0.806657731533 vn -0.7127789855 -0.548462927341 0.437189429998 vn -0.582065582275 -0.102484077215 0.806657731533 vn -0.547202169895 -0.673244833946 0.497303903103 vn 0.582065582275 -0.102484077215 0.806657731533 vn 0.441982060671 -0.0220960509032 0.896751701832 vn 0.7127789855 -0.548462927341 0.437189429998 vn 0.582065582275 -0.102484077215 0.806657731533 vn 0.7127789855 -0.548462927341 0.437189429998 vn 0.547202169895 -0.673244833946 0.497303903103 vn 0.143197178841 -0.754013121128 0.641060650349 vn -0.547202169895 -0.673244833946 0.497303903103 vn -0.582065582275 -0.102484077215 0.806657731533 vn 0.143197178841 -0.754013121128 0.641060650349 vn -0.582065582275 -0.102484077215 0.806657731533 vn -0.371665358543 -0.093267314136 0.923669874668 vn 0.582065582275 -0.102484077215 0.806657731533 vn 0.547202169895 -0.673244833946 0.497303903103 vn -0.143197178841 -0.754013121128 0.641060650349 vn 0.582065582275 -0.102484077215 0.806657731533 vn -0.143197178841 -0.754013121128 0.641060650349 vn 0.371665358543 -0.093267314136 0.923669874668 vn 0.988684535027 -0.0798064619303 0.127018928528 vn 0.143197178841 -0.754013121128 0.641060650349 vn -0.371665358543 -0.093267314136 0.923669874668 vn 0.988684535027 -0.0798064619303 0.127018928528 vn -0.371665358543 -0.093267314136 0.923669874668 vn 0.154610216618 -0.0777018517256 0.9849152565 vn 0.371665358543 -0.093267314136 0.923669874668 vn -0.143197178841 -0.754013121128 0.641060650349 vn -0.988684535027 -0.0798064619303 0.127018928528 vn 0.371665358543 -0.093267314136 0.923669874668 vn -0.988684535027 -0.0798064619303 0.127018928528 vn -0.154610216618 -0.0777018517256 0.9849152565 vn 0.809712767601 0.584509372711 -0.0520967803895 vn 0.988684535027 -0.0798064619303 0.127018928528 vn 0.154610216618 -0.0777018517256 0.9849152565 vn 0.809712767601 0.584509372711 -0.0520967803895 vn 0.154610216618 -0.0777018517256 0.9849152565 vn 0.0463584400713 0.36116245389 0.931349873543 vn -0.154610216618 -0.0777018517256 0.9849152565 vn -0.988684535027 -0.0798064619303 0.127018928528 vn -0.809712767601 0.584509372711 -0.0520967803895 vn -0.154610216618 -0.0777018517256 0.9849152565 vn -0.809712767601 0.584509372711 -0.0520967803895 vn -0.0463584400713 0.36116245389 0.931349873543 vn 0.208019003272 0.953786611557 0.216839045286 vn 0.809712767601 0.584509372711 -0.0520967803895 vn 0.0463584400713 0.36116245389 0.931349873543 vn 0.208019003272 0.953786611557 0.216839045286 vn 0.0463584400713 0.36116245389 0.931349873543 vn -0.507928073406 0.300734430552 0.807197570801 vn -0.0463584400713 0.36116245389 0.931349873543 vn -0.809712767601 0.584509372711 -0.0520967803895 vn -0.208019003272 0.953786611557 0.216839045286 vn -0.0463584400713 0.36116245389 0.931349873543 vn -0.208019003272 0.953786611557 0.216839045286 vn 0.507928073406 0.300734430552 0.807197570801 vn -0.164958000183 0.859460175037 0.48385643959 vn 0.208019003272 0.953786611557 0.216839045286 vn -0.507928073406 0.300734430552 0.807197570801 vn -0.164958000183 0.859460175037 0.48385643959 vn -0.507928073406 0.300734430552 0.807197570801 vn -0.337028026581 0.31645783782 0.886716723442 vn 0.507928073406 0.300734430552 0.807197570801 vn -0.208019003272 0.953786611557 0.216839045286 vn 0.164958000183 0.859460175037 0.48385643959 vn 0.507928073406 0.300734430552 0.807197570801 vn 0.164958000183 0.859460175037 0.48385643959 vn 0.337028026581 0.31645783782 0.886716723442 vn -0.337028026581 0.31645783782 0.886716723442 vn -0.507928073406 0.300734430552 0.807197570801 vn -0.485469311476 -0.792858958244 0.368367046118 vn -0.337028026581 0.31645783782 0.886716723442 vn -0.485469311476 -0.792858958244 0.368367046118 vn 0.0437948256731 -0.654389321804 -0.754888474941 vn 0.485469311476 -0.792858958244 0.368367046118 vn 0.507928073406 0.300734430552 0.807197570801 vn 0.337028026581 0.31645783782 0.886716723442 vn 0.485469311476 -0.792858958244 0.368367046118 vn 0.337028026581 0.31645783782 0.886716723442 vn -0.0437948256731 -0.654389321804 -0.754888474941 vn -0.507928073406 0.300734430552 0.807197570801 vn 0.0463584400713 0.36116245389 0.931349873543 vn -0.661450505257 -0.479004502296 0.577094376087 vn -0.507928073406 0.300734430552 0.807197570801 vn -0.661450505257 -0.479004502296 0.577094376087 vn -0.485469311476 -0.792858958244 0.368367046118 vn 0.661450505257 -0.479004502296 0.577094376087 vn -0.0463584400713 0.36116245389 0.931349873543 vn 0.507928073406 0.300734430552 0.807197570801 vn 0.661450505257 -0.479004502296 0.577094376087 vn 0.507928073406 0.300734430552 0.807197570801 vn 0.485469311476 -0.792858958244 0.368367046118 vn 0.0463584400713 0.36116245389 0.931349873543 vn 0.154610216618 -0.0777018517256 0.9849152565 vn -0.762606561184 0.175117522478 0.622707903385 vn 0.0463584400713 0.36116245389 0.931349873543 vn -0.762606561184 0.175117522478 0.622707903385 vn -0.661450505257 -0.479004502296 0.577094376087 vn 0.762606561184 0.175117522478 0.622707903385 vn -0.154610216618 -0.0777018517256 0.9849152565 vn -0.0463584400713 0.36116245389 0.931349873543 vn 0.762606561184 0.175117522478 0.622707903385 vn -0.0463584400713 0.36116245389 0.931349873543 vn 0.661450505257 -0.479004502296 0.577094376087 vn 0.154610216618 -0.0777018517256 0.9849152565 vn -0.371665358543 -0.093267314136 0.923669874668 vn 0.0866444334388 0.680886685848 -0.727245509624 vn 0.154610216618 -0.0777018517256 0.9849152565 vn 0.0866444334388 0.680886685848 -0.727245509624 vn -0.762606561184 0.175117522478 0.622707903385 vn -0.0866444334388 0.680886685848 -0.727245509624 vn 0.371665358543 -0.093267314136 0.923669874668 vn -0.154610216618 -0.0777018517256 0.9849152565 vn -0.0866444334388 0.680886685848 -0.727245509624 vn -0.154610216618 -0.0777018517256 0.9849152565 vn 0.762606561184 0.175117522478 0.622707903385 vn -0.371665358543 -0.093267314136 0.923669874668 vn -0.582065582275 -0.102484077215 0.806657731533 vn 0.578987181187 0.430631458759 -0.692336916924 vn -0.371665358543 -0.093267314136 0.923669874668 vn 0.578987181187 0.430631458759 -0.692336916924 vn 0.0866444334388 0.680886685848 -0.727245509624 vn -0.578987181187 0.430631458759 -0.692336916924 vn 0.582065582275 -0.102484077215 0.806657731533 vn 0.371665358543 -0.093267314136 0.923669874668 vn -0.578987181187 0.430631458759 -0.692336916924 vn 0.371665358543 -0.093267314136 0.923669874668 vn -0.0866444334388 0.680886685848 -0.727245509624 vn -0.441982060671 -0.0220960509032 0.896751701832 vn 0.314834296703 0.77429831028 0.548945784569 vn 0.578987181187 0.430631458759 -0.692336916924 vn -0.441982060671 -0.0220960509032 0.896751701832 vn 0.578987181187 0.430631458759 -0.692336916924 vn -0.582065582275 -0.102484077215 0.806657731533 vn -0.578987181187 0.430631458759 -0.692336916924 vn -0.314834296703 0.77429831028 0.548945784569 vn 0.441982060671 -0.0220960509032 0.896751701832 vn -0.578987181187 0.430631458759 -0.692336916924 vn 0.441982060671 -0.0220960509032 0.896751701832 vn 0.582065582275 -0.102484077215 0.806657731533 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.526461541653 -0.659373998642 -0.536716103554 vn -0.498844414949 -0.835751354694 -0.22950810194 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.498844414949 -0.835751354694 -0.22950810194 vn -0.596835255623 -0.785871684551 -0.161843776703 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.526461541653 -0.659373998642 -0.536716103554 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.596835255623 -0.785871684551 -0.161843776703 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.596835255623 -0.785871684551 -0.161843776703 vn -0.291121631861 -0.919296205044 -0.264844685793 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.291121631861 -0.919296205044 -0.264844685793 vn -0.269178330898 -0.631470382214 -0.727178215981 vn 0.291121631861 -0.919296205044 -0.264844685793 vn 0.596835255623 -0.785871684551 -0.161843776703 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.291121631861 -0.919296205044 -0.264844685793 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.269178330898 -0.631470382214 -0.727178215981 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.620027184486 -0.0690648555756 -0.781534612179 vn -0.45613655448 0.151953965425 -0.876840591431 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.45613655448 0.151953965425 -0.876840591431 vn -0.440368294716 -0.32085326314 -0.838527858257 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.620027184486 -0.0690648555756 -0.781534612179 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.440368294716 -0.32085326314 -0.838527858257 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.269178330898 -0.631470382214 -0.727178215981 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.54211473465 -0.499296098948 -0.675880908966 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.620027184486 -0.0690648555756 -0.781534612179 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.269178330898 -0.631470382214 -0.727178215981 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.54211473465 -0.499296098948 -0.675880908966 vn 0.620027184486 -0.0690648555756 -0.781534612179 vn -0.98409897089 -0.160959467292 0.0751083120704 vn 0.213936015964 -0.600852012634 0.770200133324 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.98409897089 -0.160959467292 0.0751083120704 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.58612203598 -0.795209348202 0.155251383781 vn 0.457334339619 -0.873711526394 -0.165751263499 vn -0.213936015964 -0.600852012634 0.770200133324 vn 0.98409897089 -0.160959467292 0.0751083120704 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.98409897089 -0.160959467292 0.0751083120704 vn 0.58612203598 -0.795209348202 0.155251383781 vn -0.58612203598 -0.795209348202 0.155251383781 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn -0.58612203598 -0.795209348202 0.155251383781 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn -0.721651077271 -0.687195241451 0.0835608839989 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.58612203598 -0.795209348202 0.155251383781 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn 0.58612203598 -0.795209348202 0.155251383781 vn 0.721651077271 -0.687195241451 0.0835608839989 vn -0.596835255623 -0.785871684551 -0.161843776703 vn -0.58612203598 -0.795209348202 0.155251383781 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.596835255623 -0.785871684551 -0.161843776703 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.291121631861 -0.919296205044 -0.264844685793 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.58612203598 -0.795209348202 0.155251383781 vn 0.596835255623 -0.785871684551 -0.161843776703 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.596835255623 -0.785871684551 -0.161843776703 vn 0.291121631861 -0.919296205044 -0.264844685793 vn -0.596835255623 -0.785871684551 -0.161843776703 vn -0.498844414949 -0.835751354694 -0.22950810194 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.596835255623 -0.785871684551 -0.161843776703 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.58612203598 -0.795209348202 0.155251383781 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.596835255623 -0.785871684551 -0.161843776703 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.596835255623 -0.785871684551 -0.161843776703 vn 0.58612203598 -0.795209348202 0.155251383781 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.892672538757 0.260782450438 -0.367597967386 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.758853852749 -0.167579576373 -0.629331350327 vn 0.990731358528 -0.057070132345 -0.123265378177 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.892672538757 0.260782450438 -0.367597967386 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.85381090641 0.519959151745 -0.0254837051034 vn -0.990731358528 -0.057070132345 -0.123265378177 vn -0.85381090641 0.519959151745 -0.0254837051034 vn 0.990731358528 -0.057070132345 -0.123265378177 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.741771996021 0.516447842121 0.427850306034 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.990731358528 -0.057070132345 -0.123265378177 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.741771996021 0.516447842121 0.427850306034 vn -0.741771996021 0.516447842121 0.427850306034 vn -0.998098790646 -0.0323503129184 -0.0524624437094 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.741771996021 0.516447842121 0.427850306034 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.546166479588 0.837042272091 0.0325942002237 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.998098790646 -0.0323503129184 -0.0524624437094 vn 0.741771996021 0.516447842121 0.427850306034 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.741771996021 0.516447842121 0.427850306034 vn 0.546166479588 0.837042272091 0.0325942002237 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.908616304398 -0.393208831549 -0.140723824501 vn -0.724500596523 0.618506669998 -0.304217636585 vn -0.98549079895 -0.166054174304 0.0351274311543 vn -0.724500596523 0.618506669998 -0.304217636585 vn -0.546166479588 0.837042272091 0.0325942002237 vn 0.724500596523 0.618506669998 -0.304217636585 vn 0.908616304398 -0.393208831549 -0.140723824501 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.724500596523 0.618506669998 -0.304217636585 vn 0.98549079895 -0.166054174304 0.0351274311543 vn 0.546166479588 0.837042272091 0.0325942002237 vn -0.298906475306 0.902090847492 0.311266809702 vn -0.208597734571 0.88837915659 -0.408985853195 vn -0.481588333845 -0.0369583964348 0.875617921352 vn -0.298906475306 0.902090847492 0.311266809702 vn -0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.500936388969 0.865484118462 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.208597734571 0.88837915659 -0.408985853195 vn 0.298906475306 0.902090847492 0.311266809702 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.298906475306 0.902090847492 0.311266809702 vn 0.0 0.500936388969 0.865484118462 vn -0.112648315728 0.654861807823 -0.747306108475 vn 0.472529500723 0.524442732334 -0.708290696144 vn -0.481588333845 -0.0369583964348 0.875617921352 vn -0.112648315728 0.654861807823 -0.747306108475 vn -0.481588333845 -0.0369583964348 0.875617921352 vn -0.208597734571 0.88837915659 -0.408985853195 vn 0.481588333845 -0.0369583964348 0.875617921352 vn -0.472529500723 0.524442732334 -0.708290696144 vn 0.112648315728 0.654861807823 -0.747306108475 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.112648315728 0.654861807823 -0.747306108475 vn 0.208597734571 0.88837915659 -0.408985853195 vn -0.464404165745 0.728635668755 0.503407180309 vn -0.298906475306 0.902090847492 0.311266809702 vn 0.0 0.500936388969 0.865484118462 vn -0.464404165745 0.728635668755 0.503407180309 vn 0.0 0.500936388969 0.865484118462 vn 0.0 0.847754716873 0.530388474464 vn 0.0 0.500936388969 0.865484118462 vn 0.298906475306 0.902090847492 0.311266809702 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.0 0.500936388969 0.865484118462 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.0 0.847754716873 0.530388474464 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.373124480247 0.903879225254 -0.20923781395 vn -0.208597734571 0.88837915659 -0.408985853195 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.208597734571 0.88837915659 -0.408985853195 vn -0.298906475306 0.902090847492 0.311266809702 vn 0.208597734571 0.88837915659 -0.408985853195 vn 0.373124480247 0.903879225254 -0.20923781395 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.208597734571 0.88837915659 -0.408985853195 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.298906475306 0.902090847492 0.311266809702 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.298906475306 0.902090847492 0.311266809702 vn -0.464404165745 0.728635668755 0.503407180309 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.464404165745 0.728635668755 0.503407180309 vn -0.668193697929 0.671886563301 0.319508522749 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.298906475306 0.902090847492 0.311266809702 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.668193697929 0.671886563301 0.319508522749 vn -0.668193697929 0.671886563301 0.319508522749 vn -0.464404165745 0.728635668755 0.503407180309 vn -0.415821105242 0.908702611923 0.0367753691971 vn -0.668193697929 0.671886563301 0.319508522749 vn -0.415821105242 0.908702611923 0.0367753691971 vn -0.678407728672 0.731388807297 -0.0695223808289 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.668193697929 0.671886563301 0.319508522749 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.668193697929 0.671886563301 0.319508522749 vn 0.678407728672 0.731388807297 -0.0695223808289 vn -0.678407728672 0.731388807297 -0.0695223808289 vn -0.415821105242 0.908702611923 0.0367753691971 vn -0.391261488199 0.815301001072 -0.426847368479 vn -0.678407728672 0.731388807297 -0.0695223808289 vn -0.391261488199 0.815301001072 -0.426847368479 vn -0.614354372025 0.560182511806 -0.555665612221 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.678407728672 0.731388807297 -0.0695223808289 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.678407728672 0.731388807297 -0.0695223808289 vn 0.614354372025 0.560182511806 -0.555665612221 vn -0.614354372025 0.560182511806 -0.555665612221 vn -0.391261488199 0.815301001072 -0.426847368479 vn -0.45613655448 0.151953965425 -0.876840591431 vn -0.614354372025 0.560182511806 -0.555665612221 vn -0.45613655448 0.151953965425 -0.876840591431 vn -0.620027184486 -0.0690648555756 -0.781534612179 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.614354372025 0.560182511806 -0.555665612221 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.614354372025 0.560182511806 -0.555665612221 vn 0.620027184486 -0.0690648555756 -0.781534612179 vn -0.614354372025 0.560182511806 -0.555665612221 vn -0.620027184486 -0.0690648555756 -0.781534612179 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.614354372025 0.560182511806 -0.555665612221 vn -0.758853852749 -0.167579576373 -0.629331350327 vn -0.892672538757 0.260782450438 -0.367597967386 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.620027184486 -0.0690648555756 -0.781534612179 vn 0.614354372025 0.560182511806 -0.555665612221 vn 0.758853852749 -0.167579576373 -0.629331350327 vn 0.614354372025 0.560182511806 -0.555665612221 vn 0.892672538757 0.260782450438 -0.367597967386 vn -0.892672538757 0.260782450438 -0.367597967386 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.678407728672 0.731388807297 -0.0695223808289 vn -0.892672538757 0.260782450438 -0.367597967386 vn -0.678407728672 0.731388807297 -0.0695223808289 vn -0.614354372025 0.560182511806 -0.555665612221 vn 0.678407728672 0.731388807297 -0.0695223808289 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.892672538757 0.260782450438 -0.367597967386 vn 0.678407728672 0.731388807297 -0.0695223808289 vn 0.892672538757 0.260782450438 -0.367597967386 vn 0.614354372025 0.560182511806 -0.555665612221 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.741771996021 0.516447842121 0.427850306034 vn -0.668193697929 0.671886563301 0.319508522749 vn -0.85381090641 0.519959151745 -0.0254837051034 vn -0.668193697929 0.671886563301 0.319508522749 vn -0.678407728672 0.731388807297 -0.0695223808289 vn 0.668193697929 0.671886563301 0.319508522749 vn 0.741771996021 0.516447842121 0.427850306034 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.668193697929 0.671886563301 0.319508522749 vn 0.85381090641 0.519959151745 -0.0254837051034 vn 0.678407728672 0.731388807297 -0.0695223808289 vn -0.741771996021 0.516447842121 0.427850306034 vn -0.546166479588 0.837042272091 0.0325942002237 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.741771996021 0.516447842121 0.427850306034 vn -0.45391741395 0.790304005146 0.411556243896 vn -0.668193697929 0.671886563301 0.319508522749 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.546166479588 0.837042272091 0.0325942002237 vn 0.741771996021 0.516447842121 0.427850306034 vn 0.45391741395 0.790304005146 0.411556243896 vn 0.741771996021 0.516447842121 0.427850306034 vn 0.668193697929 0.671886563301 0.319508522749 vn -0.546166479588 0.837042272091 0.0325942002237 vn -0.724500596523 0.618506669998 -0.304217636585 vn -0.373124480247 0.903879225254 -0.20923781395 vn -0.546166479588 0.837042272091 0.0325942002237 vn -0.373124480247 0.903879225254 -0.20923781395 vn -0.45391741395 0.790304005146 0.411556243896 vn 0.373124480247 0.903879225254 -0.20923781395 vn 0.724500596523 0.618506669998 -0.304217636585 vn 0.546166479588 0.837042272091 0.0325942002237 vn 0.373124480247 0.903879225254 -0.20923781395 vn 0.546166479588 0.837042272091 0.0325942002237 vn 0.45391741395 0.790304005146 0.411556243896 vn -0.45613655448 0.151953965425 -0.876840591431 vn -0.391261488199 0.815301001072 -0.426847368479 vn 0.0 0.834245860577 -0.551392674446 vn -0.45613655448 0.151953965425 -0.876840591431 vn 0.0 0.834245860577 -0.551392674446 vn 0.0 0.335953563452 -0.941878557205 vn 0.0 0.834245860577 -0.551392674446 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.0 0.834245860577 -0.551392674446 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.0 0.335953563452 -0.941878557205 vn -0.391261488199 0.815301001072 -0.426847368479 vn -0.415821105242 0.908702611923 0.0367753691971 vn 0.0 0.999826133251 0.0186469815671 vn -0.391261488199 0.815301001072 -0.426847368479 vn 0.0 0.999826133251 0.0186469815671 vn 0.0 0.834245860577 -0.551392674446 vn 0.0 0.999826133251 0.0186469815671 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.0 0.999826133251 0.0186469815671 vn 0.391261488199 0.815301001072 -0.426847368479 vn 0.0 0.834245860577 -0.551392674446 vn -0.415821105242 0.908702611923 0.0367753691971 vn -0.464404165745 0.728635668755 0.503407180309 vn 0.0 0.847754716873 0.530388474464 vn -0.415821105242 0.908702611923 0.0367753691971 vn 0.0 0.847754716873 0.530388474464 vn 0.0 0.999826133251 0.0186469815671 vn 0.0 0.847754716873 0.530388474464 vn 0.464404165745 0.728635668755 0.503407180309 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.0 0.847754716873 0.530388474464 vn 0.415821105242 0.908702611923 0.0367753691971 vn 0.0 0.999826133251 0.0186469815671 vn -0.440368294716 -0.32085326314 -0.838527858257 vn -0.45613655448 0.151953965425 -0.876840591431 vn 0.0 0.335953563452 -0.941878557205 vn -0.440368294716 -0.32085326314 -0.838527858257 vn 0.0 0.335953563452 -0.941878557205 vn 0.0 -0.264325767756 -0.964433431625 vn 0.0 0.335953563452 -0.941878557205 vn 0.45613655448 0.151953965425 -0.876840591431 vn 0.440368294716 -0.32085326314 -0.838527858257 vn 0.0 0.335953563452 -0.941878557205 vn 0.440368294716 -0.32085326314 -0.838527858257 vn 0.0 -0.264325767756 -0.964433431625 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn -0.908616304398 -0.393208831549 -0.140723824501 vn -0.721651077271 -0.687195241451 0.0835608839989 vn -0.908616304398 -0.393208831549 -0.140723824501 vn -0.98549079895 -0.166054174304 0.0351274311543 vn 0.908616304398 -0.393208831549 -0.140723824501 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.908616304398 -0.393208831549 -0.140723824501 vn 0.721651077271 -0.687195241451 0.0835608839989 vn 0.98549079895 -0.166054174304 0.0351274311543 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.597621679306 -0.782413840294 -0.175148144364 vn -0.944012701511 0.105168364942 -0.312697350979 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.944012701511 0.105168364942 -0.312697350979 vn -0.98409897089 -0.160959467292 0.0751083120704 vn 0.944012701511 0.105168364942 -0.312697350979 vn 0.597621679306 -0.782413840294 -0.175148144364 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.944012701511 0.105168364942 -0.312697350979 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.98409897089 -0.160959467292 0.0751083120704 vn -0.597621679306 -0.782413840294 -0.175148144364 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn 0.0 -0.983057200909 -0.183298915625 vn -0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.983057200909 -0.183298915625 vn 0.0 -0.701207458973 -0.712957322598 vn 0.0 -0.983057200909 -0.183298915625 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.983057200909 -0.183298915625 vn 0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.701207458973 -0.712957322598 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn -0.498844414949 -0.835751354694 -0.22950810194 vn 0.0 -0.938404560089 -0.345538467169 vn -0.566593766212 -0.823994874954 -0.00198376481421 vn 0.0 -0.938404560089 -0.345538467169 vn 0.0 -0.983057200909 -0.183298915625 vn 0.0 -0.938404560089 -0.345538467169 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.0 -0.938404560089 -0.345538467169 vn 0.566593766212 -0.823994874954 -0.00198376481421 vn 0.0 -0.983057200909 -0.183298915625 vn -0.498844414949 -0.835751354694 -0.22950810194 vn -0.526461541653 -0.659373998642 -0.536716103554 vn 0.0 -0.69560033083 -0.718428969383 vn -0.498844414949 -0.835751354694 -0.22950810194 vn 0.0 -0.69560033083 -0.718428969383 vn 0.0 -0.938404560089 -0.345538467169 vn 0.0 -0.69560033083 -0.718428969383 vn 0.526461541653 -0.659373998642 -0.536716103554 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.0 -0.69560033083 -0.718428969383 vn 0.498844414949 -0.835751354694 -0.22950810194 vn 0.0 -0.938404560089 -0.345538467169 vn -0.526461541653 -0.659373998642 -0.536716103554 vn -0.440368294716 -0.32085326314 -0.838527858257 vn 0.0 -0.264325767756 -0.964433431625 vn -0.526461541653 -0.659373998642 -0.536716103554 vn 0.0 -0.264325767756 -0.964433431625 vn 0.0 -0.69560033083 -0.718428969383 vn 0.0 -0.264325767756 -0.964433431625 vn 0.440368294716 -0.32085326314 -0.838527858257 vn 0.526461541653 -0.659373998642 -0.536716103554 vn 0.0 -0.264325767756 -0.964433431625 vn 0.526461541653 -0.659373998642 -0.536716103554 vn 0.0 -0.69560033083 -0.718428969383 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.752599895 -0.591123640537 0.290114164352 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.457334339619 -0.873711526394 -0.165751263499 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.335889905691 -0.941779613495 -0.0151373241097 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.752599895 -0.591123640537 0.290114164352 vn 0.457334339619 -0.873711526394 -0.165751263499 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.335889905691 -0.941779613495 -0.0151373241097 vn 0.213936015964 -0.600852012634 0.770200133324 vn -0.916899502277 0.384027779102 0.108710713685 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn 0.213936015964 -0.600852012634 0.770200133324 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.752599895 -0.591123640537 0.290114164352 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.916899502277 0.384027779102 0.108710713685 vn -0.213936015964 -0.600852012634 0.770200133324 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn -0.213936015964 -0.600852012634 0.770200133324 vn 0.752599895 -0.591123640537 0.290114164352 vn -0.98409897089 -0.160959467292 0.0751083120704 vn -0.944012701511 0.105168364942 -0.312697350979 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.98409897089 -0.160959467292 0.0751083120704 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.922835826874 0.371478199959 0.101872675121 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.944012701511 0.105168364942 -0.312697350979 vn 0.98409897089 -0.160959467292 0.0751083120704 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.98409897089 -0.160959467292 0.0751083120704 vn 0.922835826874 0.371478199959 0.101872675121 vn 0.213936015964 -0.600852012634 0.770200133324 vn -0.98409897089 -0.160959467292 0.0751083120704 vn -0.922835826874 0.371478199959 0.101872675121 vn 0.213936015964 -0.600852012634 0.770200133324 vn -0.922835826874 0.371478199959 0.101872675121 vn -0.916899502277 0.384027779102 0.108710713685 vn 0.922835826874 0.371478199959 0.101872675121 vn 0.98409897089 -0.160959467292 0.0751083120704 vn -0.213936015964 -0.600852012634 0.770200133324 vn 0.922835826874 0.371478199959 0.101872675121 vn -0.213936015964 -0.600852012634 0.770200133324 vn 0.916899502277 0.384027779102 0.108710713685 vn -0.630367040634 0.141912698746 -0.763215661049 vn -0.972817361355 0.10031530261 0.208718091249 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.630367040634 0.141912698746 -0.763215661049 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.944012701511 0.105168364942 -0.312697350979 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.972817361355 0.10031530261 0.208718091249 vn 0.630367040634 0.141912698746 -0.763215661049 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.630367040634 0.141912698746 -0.763215661049 vn 0.944012701511 0.105168364942 -0.312697350979 vn -0.391199827194 -0.278185844421 -0.877254426479 vn -0.630367040634 0.141912698746 -0.763215661049 vn -0.944012701511 0.105168364942 -0.312697350979 vn -0.391199827194 -0.278185844421 -0.877254426479 vn -0.944012701511 0.105168364942 -0.312697350979 vn -0.597621679306 -0.782413840294 -0.175148144364 vn 0.944012701511 0.105168364942 -0.312697350979 vn 0.630367040634 0.141912698746 -0.763215661049 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.944012701511 0.105168364942 -0.312697350979 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.597621679306 -0.782413840294 -0.175148144364 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn -0.513001382351 -0.451199471951 -0.730238735676 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.164742857218 -0.211467817426 -0.963400840759 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.513001382351 -0.451199471951 -0.730238735676 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn 0.164742857218 -0.211467817426 -0.963400840759 vn -0.391199827194 -0.278185844421 -0.877254426479 vn -0.164742857218 -0.211467817426 -0.963400840759 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.391199827194 -0.278185844421 -0.877254426479 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.630367040634 0.141912698746 -0.763215661049 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.164742857218 -0.211467817426 -0.963400840759 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.630367040634 0.141912698746 -0.763215661049 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.945738434792 -0.257859289646 0.197705358267 vn -0.972817361355 0.10031530261 0.208718091249 vn -0.605345726013 0.0332963056862 -0.79526591301 vn -0.972817361355 0.10031530261 0.208718091249 vn -0.630367040634 0.141912698746 -0.763215661049 vn 0.972817361355 0.10031530261 0.208718091249 vn 0.945738434792 -0.257859289646 0.197705358267 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.972817361355 0.10031530261 0.208718091249 vn 0.605345726013 0.0332963056862 -0.79526591301 vn 0.630367040634 0.141912698746 -0.763215661049 vn -0.513001382351 -0.451199471951 -0.730238735676 vn -0.525359153748 -0.83525210619 0.162332117558 vn -0.945738434792 -0.257859289646 0.197705358267 vn -0.513001382351 -0.451199471951 -0.730238735676 vn -0.945738434792 -0.257859289646 0.197705358267 vn -0.605345726013 0.0332963056862 -0.79526591301 vn 0.945738434792 -0.257859289646 0.197705358267 vn 0.525359153748 -0.83525210619 0.162332117558 vn 0.513001382351 -0.451199471951 -0.730238735676 vn 0.945738434792 -0.257859289646 0.197705358267 vn 0.513001382351 -0.451199471951 -0.730238735676 vn 0.605345726013 0.0332963056862 -0.79526591301 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn -0.161264792085 -0.973448514938 0.162455067039 vn -0.525359153748 -0.83525210619 0.162332117558 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn -0.525359153748 -0.83525210619 0.162332117558 vn -0.513001382351 -0.451199471951 -0.730238735676 vn 0.525359153748 -0.83525210619 0.162332117558 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn 0.525359153748 -0.83525210619 0.162332117558 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn 0.513001382351 -0.451199471951 -0.730238735676 vn 0.0 -0.852388858795 -0.522908389568 vn 0.0 -0.964891910553 0.262647390366 vn -0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.852388858795 -0.522908389568 vn -0.161264792085 -0.973448514938 0.162455067039 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.964891910553 0.262647390366 vn 0.0 -0.852388858795 -0.522908389568 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.852388858795 -0.522908389568 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn -0.164742857218 -0.211467817426 -0.963400840759 vn 0.0 -0.356859445572 -0.934158086777 vn 0.0 -0.852388858795 -0.522908389568 vn -0.164742857218 -0.211467817426 -0.963400840759 vn 0.0 -0.852388858795 -0.522908389568 vn -0.0481283962727 -0.73678869009 -0.674407958984 vn 0.0 -0.852388858795 -0.522908389568 vn 0.0 -0.356859445572 -0.934158086777 vn 0.164742857218 -0.211467817426 -0.963400840759 vn 0.0 -0.852388858795 -0.522908389568 vn 0.164742857218 -0.211467817426 -0.963400840759 vn 0.0481283962727 -0.73678869009 -0.674407958984 vn -0.391199827194 -0.278185844421 -0.877254426479 vn 0.0 -0.326737374067 -0.945115149021 vn 0.0 -0.356859445572 -0.934158086777 vn -0.391199827194 -0.278185844421 -0.877254426479 vn 0.0 -0.356859445572 -0.934158086777 vn -0.164742857218 -0.211467817426 -0.963400840759 vn 0.0 -0.356859445572 -0.934158086777 vn 0.0 -0.326737374067 -0.945115149021 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.0 -0.356859445572 -0.934158086777 vn 0.391199827194 -0.278185844421 -0.877254426479 vn 0.164742857218 -0.211467817426 -0.963400840759 vn -0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.701207458973 -0.712957322598 vn 0.0 -0.326737374067 -0.945115149021 vn -0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.326737374067 -0.945115149021 vn -0.391199827194 -0.278185844421 -0.877254426479 vn 0.0 -0.326737374067 -0.945115149021 vn 0.0 -0.701207458973 -0.712957322598 vn 0.597621679306 -0.782413840294 -0.175148144364 vn 0.0 -0.326737374067 -0.945115149021 vn 0.597621679306 -0.782413840294 -0.175148144364 vn 0.391199827194 -0.278185844421 -0.877254426479 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.335889905691 -0.941779613495 -0.0151373241097 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.457334339619 -0.873711526394 -0.165751263499 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.335889905691 -0.941779613495 -0.0151373241097 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.457334339619 -0.873711526394 -0.165751263499 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.544338703156 -0.837169468403 -0.0533168688416 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.908616304398 -0.393208831549 -0.140723824501 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.544338703156 -0.837169468403 -0.0533168688416 vn 0.908616304398 -0.393208831549 -0.140723824501 vn -0.908616304398 -0.393208831549 -0.140723824501 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.908616304398 -0.393208831549 -0.140723824501 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.724500596523 0.618506669998 -0.304217636585 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.908616304398 -0.393208831549 -0.140723824501 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.908616304398 -0.393208831549 -0.140723824501 vn 0.724500596523 0.618506669998 -0.304217636585 vn -0.724500596523 0.618506669998 -0.304217636585 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.724500596523 0.618506669998 -0.304217636585 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.373124480247 0.903879225254 -0.20923781395 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.724500596523 0.618506669998 -0.304217636585 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.724500596523 0.618506669998 -0.304217636585 vn 0.373124480247 0.903879225254 -0.20923781395 vn -0.373124480247 0.903879225254 -0.20923781395 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.373124480247 0.903879225254 -0.20923781395 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.208597734571 0.88837915659 -0.408985853195 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.373124480247 0.903879225254 -0.20923781395 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.373124480247 0.903879225254 -0.20923781395 vn 0.208597734571 0.88837915659 -0.408985853195 vn -0.208597734571 0.88837915659 -0.408985853195 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.224104270339 0.960202753544 0.166697189212 vn -0.208597734571 0.88837915659 -0.408985853195 vn -0.224104270339 0.960202753544 0.166697189212 vn -0.112648315728 0.654861807823 -0.747306108475 vn 0.224104270339 0.960202753544 0.166697189212 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.208597734571 0.88837915659 -0.408985853195 vn 0.224104270339 0.960202753544 0.166697189212 vn 0.208597734571 0.88837915659 -0.408985853195 vn 0.112648315728 0.654861807823 -0.747306108475 vn -0.112648315728 0.654861807823 -0.747306108475 vn -0.224104270339 0.960202753544 0.166697189212 vn 0.596377015114 0.778455018997 0.195811629295 vn -0.112648315728 0.654861807823 -0.747306108475 vn 0.596377015114 0.778455018997 0.195811629295 vn 0.472529500723 0.524442732334 -0.708290696144 vn -0.596377015114 0.778455018997 0.195811629295 vn 0.224104270339 0.960202753544 0.166697189212 vn 0.112648315728 0.654861807823 -0.747306108475 vn -0.596377015114 0.778455018997 0.195811629295 vn 0.112648315728 0.654861807823 -0.747306108475 vn -0.472529500723 0.524442732334 -0.708290696144 vn 0.472529500723 0.524442732334 -0.708290696144 vn 0.596377015114 0.778455018997 0.195811629295 vn 0.833715498447 0.538322985172 0.122991189361 vn 0.472529500723 0.524442732334 -0.708290696144 vn 0.833715498447 0.538322985172 0.122991189361 vn -0.481588333845 -0.0369583964348 0.875617921352 vn -0.833715498447 0.538322985172 0.122991189361 vn -0.596377015114 0.778455018997 0.195811629295 vn -0.472529500723 0.524442732334 -0.708290696144 vn -0.833715498447 0.538322985172 0.122991189361 vn -0.472529500723 0.524442732334 -0.708290696144 vn 0.481588333845 -0.0369583964348 0.875617921352 vn -0.481588333845 -0.0369583964348 0.875617921352 vn 0.833715498447 0.538322985172 0.122991189361 vn 0.0 0.970514774323 0.241041690111 vn -0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.970514774323 0.241041690111 vn 0.0 0.859208881855 0.511624991894 vn 0.0 0.970514774323 0.241041690111 vn -0.833715498447 0.538322985172 0.122991189361 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.970514774323 0.241041690111 vn 0.481588333845 -0.0369583964348 0.875617921352 vn 0.0 0.859208881855 0.511624991894 vn -0.688063919544 0.298481494188 0.661420345306 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn -0.158056274056 -0.0842315778136 0.983830928802 vn -0.688063919544 0.298481494188 0.661420345306 vn -0.158056274056 -0.0842315778136 0.983830928802 vn -0.801651477814 0.0109869623557 0.597690761089 vn 0.158056274056 -0.0842315778136 0.983830928802 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn 0.688063919544 0.298481494188 0.661420345306 vn 0.158056274056 -0.0842315778136 0.983830928802 vn 0.688063919544 0.298481494188 0.661420345306 vn 0.801651477814 0.0109869623557 0.597690761089 vn -0.801651477814 0.0109869623557 0.597690761089 vn -0.158056274056 -0.0842315778136 0.983830928802 vn -0.301103204489 -0.0836838632822 0.949912548065 vn -0.801651477814 0.0109869623557 0.597690761089 vn -0.301103204489 -0.0836838632822 0.949912548065 vn -0.789373278618 -0.203195333481 0.579311192036 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.158056274056 -0.0842315778136 0.983830928802 vn 0.801651477814 0.0109869623557 0.597690761089 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.801651477814 0.0109869623557 0.597690761089 vn 0.789373278618 -0.203195333481 0.579311192036 vn -0.789373278618 -0.203195333481 0.579311192036 vn -0.301103204489 -0.0836838632822 0.949912548065 vn -0.205605506897 -0.0931435450912 0.974192321301 vn -0.789373278618 -0.203195333481 0.579311192036 vn -0.205605506897 -0.0931435450912 0.974192321301 vn -0.463437467813 -0.394921332598 0.793260872364 vn 0.205605506897 -0.0931435450912 0.974192321301 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.789373278618 -0.203195333481 0.579311192036 vn 0.205605506897 -0.0931435450912 0.974192321301 vn 0.789373278618 -0.203195333481 0.579311192036 vn 0.463437467813 -0.394921332598 0.793260872364 vn -0.419674694538 0.600838899612 0.680342376232 vn -0.511010408401 0.859568059444 0.00332657271065 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn -0.419674694538 0.600838899612 0.680342376232 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn -0.688063919544 0.298481494188 0.661420345306 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn 0.511010408401 0.859568059444 0.00332657271065 vn 0.419674694538 0.600838899612 0.680342376232 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn 0.419674694538 0.600838899612 0.680342376232 vn 0.688063919544 0.298481494188 0.661420345306 vn -0.183328554034 0.552335679531 0.813213348389 vn -0.196907907724 -0.187050297856 0.962413370609 vn -0.511010408401 0.859568059444 0.00332657271065 vn -0.183328554034 0.552335679531 0.813213348389 vn -0.511010408401 0.859568059444 0.00332657271065 vn -0.419674694538 0.600838899612 0.680342376232 vn 0.511010408401 0.859568059444 0.00332657271065 vn 0.196907907724 -0.187050297856 0.962413370609 vn 0.183328554034 0.552335679531 0.813213348389 vn 0.511010408401 0.859568059444 0.00332657271065 vn 0.183328554034 0.552335679531 0.813213348389 vn 0.419674694538 0.600838899612 0.680342376232 vn 0.174811288714 0.591605603695 0.787047564983 vn -0.288803100586 -0.0350665487349 0.956746101379 vn -0.196907907724 -0.187050297856 0.962413370609 vn 0.174811288714 0.591605603695 0.787047564983 vn -0.196907907724 -0.187050297856 0.962413370609 vn -0.183328554034 0.552335679531 0.813213348389 vn 0.196907907724 -0.187050297856 0.962413370609 vn 0.288803100586 -0.0350665487349 0.956746101379 vn -0.174811288714 0.591605603695 0.787047564983 vn 0.196907907724 -0.187050297856 0.962413370609 vn -0.174811288714 0.591605603695 0.787047564983 vn 0.183328554034 0.552335679531 0.813213348389 vn 0.14829044044 0.221932098269 0.963719904423 vn -0.289410889149 -0.0891457572579 0.953044772148 vn -0.288803100586 -0.0350665487349 0.956746101379 vn 0.14829044044 0.221932098269 0.963719904423 vn -0.288803100586 -0.0350665487349 0.956746101379 vn 0.174811288714 0.591605603695 0.787047564983 vn 0.288803100586 -0.0350665487349 0.956746101379 vn 0.289410889149 -0.0891457572579 0.953044772148 vn -0.14829044044 0.221932098269 0.963719904423 vn 0.288803100586 -0.0350665487349 0.956746101379 vn -0.14829044044 0.221932098269 0.963719904423 vn -0.174811288714 0.591605603695 0.787047564983 vn 0.388874441385 -0.147865071893 0.909347355366 vn -0.168616816401 -0.0761140957475 0.982738554478 vn -0.289410889149 -0.0891457572579 0.953044772148 vn 0.388874441385 -0.147865071893 0.909347355366 vn -0.289410889149 -0.0891457572579 0.953044772148 vn 0.14829044044 0.221932098269 0.963719904423 vn 0.289410889149 -0.0891457572579 0.953044772148 vn 0.168616816401 -0.0761140957475 0.982738554478 vn -0.388874441385 -0.147865071893 0.909347355366 vn 0.289410889149 -0.0891457572579 0.953044772148 vn -0.388874441385 -0.147865071893 0.909347355366 vn -0.14829044044 0.221932098269 0.963719904423 vn 0.148138836026 -0.548516571522 0.822912156582 vn -0.311056345701 -0.0972051024437 0.945407390594 vn -0.168616816401 -0.0761140957475 0.982738554478 vn 0.148138836026 -0.548516571522 0.822912156582 vn -0.168616816401 -0.0761140957475 0.982738554478 vn 0.388874441385 -0.147865071893 0.909347355366 vn 0.168616816401 -0.0761140957475 0.982738554478 vn 0.311056345701 -0.0972051024437 0.945407390594 vn -0.148138836026 -0.548516571522 0.822912156582 vn 0.168616816401 -0.0761140957475 0.982738554478 vn -0.148138836026 -0.548516571522 0.822912156582 vn -0.388874441385 -0.147865071893 0.909347355366 vn 0.139473497868 -0.915397822857 0.377616107464 vn 0.284105449915 -0.95260322094 -0.108771279454 vn -0.311056345701 -0.0972051024437 0.945407390594 vn 0.139473497868 -0.915397822857 0.377616107464 vn -0.311056345701 -0.0972051024437 0.945407390594 vn 0.148138836026 -0.548516571522 0.822912156582 vn 0.311056345701 -0.0972051024437 0.945407390594 vn -0.284105449915 -0.95260322094 -0.108771279454 vn -0.139473497868 -0.915397822857 0.377616107464 vn 0.311056345701 -0.0972051024437 0.945407390594 vn -0.139473497868 -0.915397822857 0.377616107464 vn -0.148138836026 -0.548516571522 0.822912156582 vn -0.000122076642583 -0.378315508366 0.925676703453 vn -0.17233966291 0.134526878595 0.975808143616 vn 0.284105449915 -0.95260322094 -0.108771279454 vn -0.000122076642583 -0.378315508366 0.925676703453 vn 0.284105449915 -0.95260322094 -0.108771279454 vn 0.139473497868 -0.915397822857 0.377616107464 vn -0.284105449915 -0.95260322094 -0.108771279454 vn 0.17233966291 0.134526878595 0.975808143616 vn 0.000122076642583 -0.378315508366 0.925676703453 vn -0.284105449915 -0.95260322094 -0.108771279454 vn 0.000122076642583 -0.378315508366 0.925676703453 vn -0.139473497868 -0.915397822857 0.377616107464 vn -0.174387589097 -0.268326163292 0.947412312031 vn -0.131506606936 0.0649750679731 0.989183604717 vn -0.17233966291 0.134526878595 0.975808143616 vn -0.174387589097 -0.268326163292 0.947412312031 vn -0.17233966291 0.134526878595 0.975808143616 vn -0.000122076642583 -0.378315508366 0.925676703453 vn 0.17233966291 0.134526878595 0.975808143616 vn 0.131506606936 0.0649750679731 0.989183604717 vn 0.174387589097 -0.268326163292 0.947412312031 vn 0.17233966291 0.134526878595 0.975808143616 vn 0.174387589097 -0.268326163292 0.947412312031 vn 0.000122076642583 -0.378315508366 0.925676703453 vn -0.463437467813 -0.394921332598 0.793260872364 vn -0.205605506897 -0.0931435450912 0.974192321301 vn -0.131506606936 0.0649750679731 0.989183604717 vn -0.463437467813 -0.394921332598 0.793260872364 vn -0.131506606936 0.0649750679731 0.989183604717 vn -0.174387589097 -0.268326163292 0.947412312031 vn 0.131506606936 0.0649750679731 0.989183604717 vn 0.205605506897 -0.0931435450912 0.974192321301 vn 0.463437467813 -0.394921332598 0.793260872364 vn 0.131506606936 0.0649750679731 0.989183604717 vn 0.463437467813 -0.394921332598 0.793260872364 vn 0.174387589097 -0.268326163292 0.947412312031 vn -0.205605506897 -0.0931435450912 0.974192321301 vn -0.288341939449 -0.214181184769 0.933265984058 vn -0.213939204812 -0.120062313974 0.969440579414 vn -0.205605506897 -0.0931435450912 0.974192321301 vn -0.213939204812 -0.120062313974 0.969440579414 vn -0.131506606936 0.0649750679731 0.989183604717 vn 0.213939204812 -0.120062313974 0.969440579414 vn 0.288341939449 -0.214181184769 0.933265984058 vn 0.205605506897 -0.0931435450912 0.974192321301 vn 0.213939204812 -0.120062313974 0.969440579414 vn 0.205605506897 -0.0931435450912 0.974192321301 vn 0.131506606936 0.0649750679731 0.989183604717 vn -0.131506606936 0.0649750679731 0.989183604717 vn -0.213939204812 -0.120062313974 0.969440579414 vn -0.17600402236 -0.134345367551 0.975178897381 vn -0.131506606936 0.0649750679731 0.989183604717 vn -0.17600402236 -0.134345367551 0.975178897381 vn -0.17233966291 0.134526878595 0.975808143616 vn 0.17600402236 -0.134345367551 0.975178897381 vn 0.213939204812 -0.120062313974 0.969440579414 vn 0.131506606936 0.0649750679731 0.989183604717 vn 0.17600402236 -0.134345367551 0.975178897381 vn 0.131506606936 0.0649750679731 0.989183604717 vn 0.17233966291 0.134526878595 0.975808143616 vn -0.17233966291 0.134526878595 0.975808143616 vn -0.17600402236 -0.134345367551 0.975178897381 vn -0.231181889772 0.093571446836 0.968400418758 vn -0.17233966291 0.134526878595 0.975808143616 vn -0.231181889772 0.093571446836 0.968400418758 vn 0.284105449915 -0.95260322094 -0.108771279454 vn 0.231181889772 0.093571446836 0.968400418758 vn 0.17600402236 -0.134345367551 0.975178897381 vn 0.17233966291 0.134526878595 0.975808143616 vn 0.231181889772 0.093571446836 0.968400418758 vn 0.17233966291 0.134526878595 0.975808143616 vn -0.284105449915 -0.95260322094 -0.108771279454 vn 0.284105449915 -0.95260322094 -0.108771279454 vn -0.231181889772 0.093571446836 0.968400418758 vn -0.0815470069647 -0.288313835859 0.954057216644 vn 0.284105449915 -0.95260322094 -0.108771279454 vn -0.0815470069647 -0.288313835859 0.954057216644 vn -0.311056345701 -0.0972051024437 0.945407390594 vn 0.0815470069647 -0.288313835859 0.954057216644 vn 0.231181889772 0.093571446836 0.968400418758 vn -0.284105449915 -0.95260322094 -0.108771279454 vn 0.0815470069647 -0.288313835859 0.954057216644 vn -0.284105449915 -0.95260322094 -0.108771279454 vn 0.311056345701 -0.0972051024437 0.945407390594 vn -0.311056345701 -0.0972051024437 0.945407390594 vn -0.0815470069647 -0.288313835859 0.954057216644 vn -0.207711651921 -0.12143471837 0.970623254776 vn -0.311056345701 -0.0972051024437 0.945407390594 vn -0.207711651921 -0.12143471837 0.970623254776 vn -0.168616816401 -0.0761140957475 0.982738554478 vn 0.207711651921 -0.12143471837 0.970623254776 vn 0.0815470069647 -0.288313835859 0.954057216644 vn 0.311056345701 -0.0972051024437 0.945407390594 vn 0.207711651921 -0.12143471837 0.970623254776 vn 0.311056345701 -0.0972051024437 0.945407390594 vn 0.168616816401 -0.0761140957475 0.982738554478 vn -0.168616816401 -0.0761140957475 0.982738554478 vn -0.207711651921 -0.12143471837 0.970623254776 vn -0.446432203054 -0.248150140047 0.859720766544 vn -0.168616816401 -0.0761140957475 0.982738554478 vn -0.446432203054 -0.248150140047 0.859720766544 vn -0.289410889149 -0.0891457572579 0.953044772148 vn 0.446432203054 -0.248150140047 0.859720766544 vn 0.207711651921 -0.12143471837 0.970623254776 vn 0.168616816401 -0.0761140957475 0.982738554478 vn 0.446432203054 -0.248150140047 0.859720766544 vn 0.168616816401 -0.0761140957475 0.982738554478 vn 0.289410889149 -0.0891457572579 0.953044772148 vn -0.289410889149 -0.0891457572579 0.953044772148 vn -0.446432203054 -0.248150140047 0.859720766544 vn -0.435573518276 -0.359366476536 0.825306892395 vn -0.289410889149 -0.0891457572579 0.953044772148 vn -0.435573518276 -0.359366476536 0.825306892395 vn -0.288803100586 -0.0350665487349 0.956746101379 vn 0.435573518276 -0.359366476536 0.825306892395 vn 0.446432203054 -0.248150140047 0.859720766544 vn 0.289410889149 -0.0891457572579 0.953044772148 vn 0.435573518276 -0.359366476536 0.825306892395 vn 0.289410889149 -0.0891457572579 0.953044772148 vn 0.288803100586 -0.0350665487349 0.956746101379 vn -0.288803100586 -0.0350665487349 0.956746101379 vn -0.435573518276 -0.359366476536 0.825306892395 vn -0.153695300221 -0.49743437767 0.853777945042 vn -0.288803100586 -0.0350665487349 0.956746101379 vn -0.153695300221 -0.49743437767 0.853777945042 vn -0.196907907724 -0.187050297856 0.962413370609 vn 0.153695300221 -0.49743437767 0.853777945042 vn 0.435573518276 -0.359366476536 0.825306892395 vn 0.288803100586 -0.0350665487349 0.956746101379 vn 0.153695300221 -0.49743437767 0.853777945042 vn 0.288803100586 -0.0350665487349 0.956746101379 vn 0.196907907724 -0.187050297856 0.962413370609 vn -0.196907907724 -0.187050297856 0.962413370609 vn -0.153695300221 -0.49743437767 0.853777945042 vn 0.125035598874 -0.32401829958 0.937751710415 vn -0.196907907724 -0.187050297856 0.962413370609 vn 0.125035598874 -0.32401829958 0.937751710415 vn -0.511010408401 0.859568059444 0.00332657271065 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.153695300221 -0.49743437767 0.853777945042 vn 0.196907907724 -0.187050297856 0.962413370609 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.196907907724 -0.187050297856 0.962413370609 vn 0.511010408401 0.859568059444 0.00332657271065 vn -0.511010408401 0.859568059444 0.00332657271065 vn 0.125035598874 -0.32401829958 0.937751710415 vn 0.299305289984 -0.282214343548 0.911466598511 vn -0.511010408401 0.859568059444 0.00332657271065 vn 0.299305289984 -0.282214343548 0.911466598511 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn -0.299305289984 -0.282214343548 0.911466598511 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.511010408401 0.859568059444 0.00332657271065 vn -0.299305289984 -0.282214343548 0.911466598511 vn 0.511010408401 0.859568059444 0.00332657271065 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn -0.301103204489 -0.0836838632822 0.949912548065 vn 0.00100711360574 -0.120029628277 0.992769777775 vn -0.288341939449 -0.214181184769 0.933265984058 vn -0.301103204489 -0.0836838632822 0.949912548065 vn -0.288341939449 -0.214181184769 0.933265984058 vn -0.205605506897 -0.0931435450912 0.974192321301 vn 0.288341939449 -0.214181184769 0.933265984058 vn -0.00100711360574 -0.120029628277 0.992769777775 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.288341939449 -0.214181184769 0.933265984058 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.205605506897 -0.0931435450912 0.974192321301 vn -0.158056274056 -0.0842315778136 0.983830928802 vn 0.221081703901 -0.165658667684 0.961082756519 vn 0.00100711360574 -0.120029628277 0.992769777775 vn -0.158056274056 -0.0842315778136 0.983830928802 vn 0.00100711360574 -0.120029628277 0.992769777775 vn -0.301103204489 -0.0836838632822 0.949912548065 vn -0.00100711360574 -0.120029628277 0.992769777775 vn -0.221081703901 -0.165658667684 0.961082756519 vn 0.158056274056 -0.0842315778136 0.983830928802 vn -0.00100711360574 -0.120029628277 0.992769777775 vn 0.158056274056 -0.0842315778136 0.983830928802 vn 0.301103204489 -0.0836838632822 0.949912548065 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn 0.299305289984 -0.282214343548 0.911466598511 vn 0.221081703901 -0.165658667684 0.961082756519 vn 0.0137947788462 -0.0133064687252 0.999816298485 vn 0.221081703901 -0.165658667684 0.961082756519 vn -0.158056274056 -0.0842315778136 0.983830928802 vn -0.221081703901 -0.165658667684 0.961082756519 vn -0.299305289984 -0.282214343548 0.911466598511 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn -0.221081703901 -0.165658667684 0.961082756519 vn -0.0137947788462 -0.0133064687252 0.999816298485 vn 0.158056274056 -0.0842315778136 0.983830928802 vn -0.349170416594 -0.837844192982 0.419639289379 vn 0.0 -0.904743313789 0.425957232714 vn 0.0 -0.698942184448 0.715178191662 vn -0.349170416594 -0.837844192982 0.419639289379 vn 0.0 -0.698942184448 0.715178191662 vn -0.737654030323 -0.555666804314 0.383537381887 vn 0.0 -0.698942184448 0.715178191662 vn 0.0 -0.904743313789 0.425957232714 vn 0.349170416594 -0.837844192982 0.419639289379 vn 0.0 -0.698942184448 0.715178191662 vn 0.349170416594 -0.837844192982 0.419639289379 vn 0.737654030323 -0.555666804314 0.383537381887 vn 0.0 -0.698942184448 0.715178191662 vn 0.0 -0.95225250721 0.305311650038 vn -0.229809314013 -0.468072414398 0.853285372257 vn 0.0 -0.698942184448 0.715178191662 vn -0.229809314013 -0.468072414398 0.853285372257 vn -0.737654030323 -0.555666804314 0.383537381887 vn 0.229809314013 -0.468072414398 0.853285372257 vn 0.0 -0.95225250721 0.305311650038 vn 0.0 -0.698942184448 0.715178191662 vn 0.229809314013 -0.468072414398 0.853285372257 vn 0.0 -0.698942184448 0.715178191662 vn 0.737654030323 -0.555666804314 0.383537381887 vn -0.737654030323 -0.555666804314 0.383537381887 vn -0.229809314013 -0.468072414398 0.853285372257 vn 0.635133385658 0.0427572838962 0.771218121052 vn -0.737654030323 -0.555666804314 0.383537381887 vn 0.635133385658 0.0427572838962 0.771218121052 vn -0.713866174221 -0.503255724907 0.486958652735 vn -0.635133385658 0.0427572838962 0.771218121052 vn 0.229809314013 -0.468072414398 0.853285372257 vn 0.737654030323 -0.555666804314 0.383537381887 vn -0.635133385658 0.0427572838962 0.771218121052 vn 0.737654030323 -0.555666804314 0.383537381887 vn 0.713866174221 -0.503255724907 0.486958652735 vn -0.713866174221 -0.503255724907 0.486958652735 vn 0.635133385658 0.0427572838962 0.771218121052 vn 0.41411653161 0.579836428165 0.701638936996 vn -0.713866174221 -0.503255724907 0.486958652735 vn 0.41411653161 0.579836428165 0.701638936996 vn -0.349170416594 -0.837844192982 0.419639289379 vn -0.41411653161 0.579836428165 0.701638936996 vn -0.635133385658 0.0427572838962 0.771218121052 vn 0.713866174221 -0.503255724907 0.486958652735 vn -0.41411653161 0.579836428165 0.701638936996 vn 0.713866174221 -0.503255724907 0.486958652735 vn 0.349170416594 -0.837844192982 0.419639289379 vn -0.349170416594 -0.837844192982 0.419639289379 vn 0.41411653161 0.579836428165 0.701638936996 vn 0.0 0.558771312237 0.829321801662 vn -0.349170416594 -0.837844192982 0.419639289379 vn 0.0 0.558771312237 0.829321801662 vn 0.0 -0.904743313789 0.425957232714 vn 0.0 0.558771312237 0.829321801662 vn -0.41411653161 0.579836428165 0.701638936996 vn 0.349170416594 -0.837844192982 0.419639289379 vn 0.0 0.558771312237 0.829321801662 vn 0.349170416594 -0.837844192982 0.419639289379 vn 0.0 -0.904743313789 0.425957232714 vn 0.41411653161 0.579836428165 0.701638936996 vn 0.0588713921607 -0.378437191248 0.923752903938 vn 0.0 -0.346517056227 0.938043653965 vn 0.41411653161 0.579836428165 0.701638936996 vn 0.0 -0.346517056227 0.938043653965 vn 0.0 0.558771312237 0.829321801662 vn 0.0 -0.346517056227 0.938043653965 vn -0.0588713921607 -0.378437191248 0.923752903938 vn -0.41411653161 0.579836428165 0.701638936996 vn 0.0 -0.346517056227 0.938043653965 vn -0.41411653161 0.579836428165 0.701638936996 vn 0.0 0.558771312237 0.829321801662 vn 0.635133385658 0.0427572838962 0.771218121052 vn -0.197186246514 -0.28941604495 0.93667280674 vn 0.0588713921607 -0.378437191248 0.923752903938 vn 0.635133385658 0.0427572838962 0.771218121052 vn 0.0588713921607 -0.378437191248 0.923752903938 vn 0.41411653161 0.579836428165 0.701638936996 vn -0.0588713921607 -0.378437191248 0.923752903938 vn 0.197186246514 -0.28941604495 0.93667280674 vn -0.635133385658 0.0427572838962 0.771218121052 vn -0.0588713921607 -0.378437191248 0.923752903938 vn -0.635133385658 0.0427572838962 0.771218121052 vn -0.41411653161 0.579836428165 0.701638936996 vn -0.229809314013 -0.468072414398 0.853285372257 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.197186246514 -0.28941604495 0.93667280674 vn -0.229809314013 -0.468072414398 0.853285372257 vn -0.197186246514 -0.28941604495 0.93667280674 vn 0.635133385658 0.0427572838962 0.771218121052 vn 0.197186246514 -0.28941604495 0.93667280674 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.229809314013 -0.468072414398 0.853285372257 vn 0.197186246514 -0.28941604495 0.93667280674 vn 0.229809314013 -0.468072414398 0.853285372257 vn -0.635133385658 0.0427572838962 0.771218121052 vn 0.0 -0.95225250721 0.305311650038 vn 0.0 -0.610098540783 0.792325556278 vn -0.145730406046 -0.136971324682 0.979796648026 vn 0.0 -0.95225250721 0.305311650038 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.229809314013 -0.468072414398 0.853285372257 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.0 -0.610098540783 0.792325556278 vn 0.0 -0.95225250721 0.305311650038 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.0 -0.95225250721 0.305311650038 vn 0.229809314013 -0.468072414398 0.853285372257 vn -0.875598013401 0.214886218309 0.432610720396 vn -0.23539313674 0.297224640846 -0.925336480141 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.875598013401 0.214886218309 0.432610720396 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.916899502277 0.384027779102 0.108710713685 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.23539313674 0.297224640846 -0.925336480141 vn 0.875598013401 0.214886218309 0.432610720396 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.875598013401 0.214886218309 0.432610720396 vn 0.916899502277 0.384027779102 0.108710713685 vn -0.875598013401 0.214886218309 0.432610720396 vn -0.916899502277 0.384027779102 0.108710713685 vn -0.922835826874 0.371478199959 0.101872675121 vn -0.875598013401 0.214886218309 0.432610720396 vn -0.922835826874 0.371478199959 0.101872675121 vn -0.655456423759 0.133947864175 0.743259608746 vn 0.922835826874 0.371478199959 0.101872675121 vn 0.916899502277 0.384027779102 0.108710713685 vn 0.875598013401 0.214886218309 0.432610720396 vn 0.922835826874 0.371478199959 0.101872675121 vn 0.875598013401 0.214886218309 0.432610720396 vn 0.655456423759 0.133947864175 0.743259608746 vn -0.655456423759 0.133947864175 0.743259608746 vn -0.922835826874 0.371478199959 0.101872675121 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.655456423759 0.133947864175 0.743259608746 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.580199599266 0.0743141323328 0.811076939106 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.922835826874 0.371478199959 0.101872675121 vn 0.655456423759 0.133947864175 0.743259608746 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.655456423759 0.133947864175 0.743259608746 vn 0.580199599266 0.0743141323328 0.811076939106 vn -0.580199599266 0.0743141323328 0.811076939106 vn -0.132545530796 -0.000366232183296 0.991176843643 vn -0.438159108162 -0.44954264164 0.778413772583 vn -0.580199599266 0.0743141323328 0.811076939106 vn -0.438159108162 -0.44954264164 0.778413772583 vn -0.655456423759 0.133947864175 0.743259608746 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.132545530796 -0.000366232183296 0.991176843643 vn 0.580199599266 0.0743141323328 0.811076939106 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.580199599266 0.0743141323328 0.811076939106 vn 0.655456423759 0.133947864175 0.743259608746 vn -0.655456423759 0.133947864175 0.743259608746 vn -0.438159108162 -0.44954264164 0.778413772583 vn -0.915244817734 -0.0372030884027 0.401176869869 vn -0.655456423759 0.133947864175 0.743259608746 vn -0.915244817734 -0.0372030884027 0.401176869869 vn -0.875598013401 0.214886218309 0.432610720396 vn 0.915244817734 -0.0372030884027 0.401176869869 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.655456423759 0.133947864175 0.743259608746 vn 0.915244817734 -0.0372030884027 0.401176869869 vn 0.655456423759 0.133947864175 0.743259608746 vn 0.875598013401 0.214886218309 0.432610720396 vn -0.875598013401 0.214886218309 0.432610720396 vn -0.915244817734 -0.0372030884027 0.401176869869 vn -0.52346944809 0.720472455025 -0.454861760139 vn -0.875598013401 0.214886218309 0.432610720396 vn -0.52346944809 0.720472455025 -0.454861760139 vn -0.23539313674 0.297224640846 -0.925336480141 vn 0.52346944809 0.720472455025 -0.454861760139 vn 0.915244817734 -0.0372030884027 0.401176869869 vn 0.875598013401 0.214886218309 0.432610720396 vn 0.52346944809 0.720472455025 -0.454861760139 vn 0.875598013401 0.214886218309 0.432610720396 vn 0.23539313674 0.297224640846 -0.925336480141 vn -0.23539313674 0.297224640846 -0.925336480141 vn -0.52346944809 0.720472455025 -0.454861760139 vn 0.0 -0.312178105116 0.950023591518 vn -0.23539313674 0.297224640846 -0.925336480141 vn 0.0 -0.312178105116 0.950023591518 vn 0.0 0.0755645632744 0.997140884399 vn 0.0 -0.312178105116 0.950023591518 vn 0.52346944809 0.720472455025 -0.454861760139 vn 0.23539313674 0.297224640846 -0.925336480141 vn 0.0 -0.312178105116 0.950023591518 vn 0.23539313674 0.297224640846 -0.925336480141 vn 0.0 0.0755645632744 0.997140884399 vn -0.183297201991 -0.586361825466 0.789038598537 vn 0.0 -0.481522709131 0.876433610916 vn 0.0 0.157109633088 0.987581193447 vn -0.183297201991 -0.586361825466 0.789038598537 vn 0.0 0.157109633088 0.987581193447 vn -0.44741499424 -0.3175547719 0.836049497128 vn 0.0 0.157109633088 0.987581193447 vn 0.0 -0.481522709131 0.876433610916 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.0 0.157109633088 0.987581193447 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.44741499424 -0.3175547719 0.836049497128 vn -0.358171969652 0.475334733725 0.803597986698 vn -0.44741499424 -0.3175547719 0.836049497128 vn 0.0 0.157109633088 0.987581193447 vn -0.358171969652 0.475334733725 0.803597986698 vn 0.0 0.157109633088 0.987581193447 vn 0.18741799891 0.598754942417 0.778695702553 vn 0.0 0.157109633088 0.987581193447 vn 0.44741499424 -0.3175547719 0.836049497128 vn 0.358171969652 0.475334733725 0.803597986698 vn 0.0 0.157109633088 0.987581193447 vn 0.358171969652 0.475334733725 0.803597986698 vn -0.18741799891 0.598754942417 0.778695702553 vn -0.183297201991 -0.586361825466 0.789038598537 vn -0.44741499424 -0.3175547719 0.836049497128 vn -0.930630981922 -0.23735012114 0.27855142951 vn -0.183297201991 -0.586361825466 0.789038598537 vn -0.930630981922 -0.23735012114 0.27855142951 vn -0.579925715923 -0.697485625744 0.420951247215 vn 0.930630981922 -0.23735012114 0.27855142951 vn 0.44741499424 -0.3175547719 0.836049497128 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.930630981922 -0.23735012114 0.27855142951 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.579925715923 -0.697485625744 0.420951247215 vn -0.44741499424 -0.3175547719 0.836049497128 vn -0.358171969652 0.475334733725 0.803597986698 vn -0.623474001884 0.773841440678 0.111577704549 vn -0.44741499424 -0.3175547719 0.836049497128 vn -0.623474001884 0.773841440678 0.111577704549 vn -0.930630981922 -0.23735012114 0.27855142951 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.358171969652 0.475334733725 0.803597986698 vn 0.44741499424 -0.3175547719 0.836049497128 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.44741499424 -0.3175547719 0.836049497128 vn 0.930630981922 -0.23735012114 0.27855142951 vn -0.358171969652 0.475334733725 0.803597986698 vn 0.18741799891 0.598754942417 0.778695702553 vn 0.296371996403 0.939472734928 0.171914681792 vn -0.358171969652 0.475334733725 0.803597986698 vn 0.296371996403 0.939472734928 0.171914681792 vn -0.623474001884 0.773841440678 0.111577704549 vn -0.296371996403 0.939472734928 0.171914681792 vn -0.18741799891 0.598754942417 0.778695702553 vn 0.358171969652 0.475334733725 0.803597986698 vn -0.296371996403 0.939472734928 0.171914681792 vn 0.358171969652 0.475334733725 0.803597986698 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.18741799891 0.598754942417 0.778695702553 vn 0.0 0.157109633088 0.987581193447 vn 0.0 0.947637498379 0.31934812665 vn 0.18741799891 0.598754942417 0.778695702553 vn 0.0 0.947637498379 0.31934812665 vn 0.296371996403 0.939472734928 0.171914681792 vn 0.0 0.947637498379 0.31934812665 vn 0.0 0.157109633088 0.987581193447 vn -0.18741799891 0.598754942417 0.778695702553 vn 0.0 0.947637498379 0.31934812665 vn -0.18741799891 0.598754942417 0.778695702553 vn -0.296371996403 0.939472734928 0.171914681792 vn -0.183297201991 -0.586361825466 0.789038598537 vn -0.579925715923 -0.697485625744 0.420951247215 vn 0.0 -0.870815694332 0.491609662771 vn -0.183297201991 -0.586361825466 0.789038598537 vn 0.0 -0.870815694332 0.491609662771 vn 0.0 -0.481522709131 0.876433610916 vn 0.0 -0.870815694332 0.491609662771 vn 0.579925715923 -0.697485625744 0.420951247215 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.0 -0.870815694332 0.491609662771 vn 0.183297201991 -0.586361825466 0.789038598537 vn 0.0 -0.481522709131 0.876433610916 vn -0.579925715923 -0.697485625744 0.420951247215 vn -0.438159108162 -0.44954264164 0.778413772583 vn 0.0 -0.458033323288 0.888935029507 vn -0.579925715923 -0.697485625744 0.420951247215 vn 0.0 -0.458033323288 0.888935029507 vn 0.0 -0.870815694332 0.491609662771 vn 0.0 -0.458033323288 0.888935029507 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.579925715923 -0.697485625744 0.420951247215 vn 0.0 -0.458033323288 0.888935029507 vn 0.579925715923 -0.697485625744 0.420951247215 vn 0.0 -0.870815694332 0.491609662771 vn 0.296371996403 0.939472734928 0.171914681792 vn 0.0 0.947637498379 0.31934812665 vn 1.0 0.0 0.0 vn 0.296371996403 0.939472734928 0.171914681792 vn 1.0 0.0 0.0 vn 0.0 -0.312178105116 0.950023591518 vn 1.0 0.0 0.0 vn 0.0 0.947637498379 0.31934812665 vn -0.296371996403 0.939472734928 0.171914681792 vn 1.0 0.0 0.0 vn -0.296371996403 0.939472734928 0.171914681792 vn 0.0 -0.312178105116 0.950023591518 vn -0.623474001884 0.773841440678 0.111577704549 vn 0.296371996403 0.939472734928 0.171914681792 vn 0.0 -0.312178105116 0.950023591518 vn -0.623474001884 0.773841440678 0.111577704549 vn 0.0 -0.312178105116 0.950023591518 vn -0.52346944809 0.720472455025 -0.454861760139 vn 0.0 -0.312178105116 0.950023591518 vn -0.296371996403 0.939472734928 0.171914681792 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.0 -0.312178105116 0.950023591518 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.52346944809 0.720472455025 -0.454861760139 vn -0.930630981922 -0.23735012114 0.27855142951 vn -0.623474001884 0.773841440678 0.111577704549 vn -0.52346944809 0.720472455025 -0.454861760139 vn -0.930630981922 -0.23735012114 0.27855142951 vn -0.52346944809 0.720472455025 -0.454861760139 vn -0.915244817734 -0.0372030884027 0.401176869869 vn 0.52346944809 0.720472455025 -0.454861760139 vn 0.623474001884 0.773841440678 0.111577704549 vn 0.930630981922 -0.23735012114 0.27855142951 vn 0.52346944809 0.720472455025 -0.454861760139 vn 0.930630981922 -0.23735012114 0.27855142951 vn 0.915244817734 -0.0372030884027 0.401176869869 vn -0.579925715923 -0.697485625744 0.420951247215 vn -0.930630981922 -0.23735012114 0.27855142951 vn -0.915244817734 -0.0372030884027 0.401176869869 vn -0.579925715923 -0.697485625744 0.420951247215 vn -0.915244817734 -0.0372030884027 0.401176869869 vn -0.438159108162 -0.44954264164 0.778413772583 vn 0.915244817734 -0.0372030884027 0.401176869869 vn 0.930630981922 -0.23735012114 0.27855142951 vn 0.579925715923 -0.697485625744 0.420951247215 vn 0.915244817734 -0.0372030884027 0.401176869869 vn 0.579925715923 -0.697485625744 0.420951247215 vn 0.438159108162 -0.44954264164 0.778413772583 vn -0.181707963347 -0.0454117320478 0.982303380966 vn -0.145730406046 -0.136971324682 0.979796648026 vn 0.0 -0.610098540783 0.792325556278 vn -0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.610098540783 0.792325556278 vn 0.0 -0.0346693471074 0.999398827553 vn 0.0 -0.610098540783 0.792325556278 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.610098540783 0.792325556278 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.0346693471074 0.999398827553 vn 0.0 -0.00488305231556 0.999988079071 vn -0.132545530796 -0.000366232183296 0.991176843643 vn -0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.00488305231556 0.999988079071 vn -0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.0346693471074 0.999398827553 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.132545530796 -0.000366232183296 0.991176843643 vn 0.0 -0.00488305231556 0.999988079071 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.0 -0.00488305231556 0.999988079071 vn 0.0 -0.0346693471074 0.999398827553 vn 0.0 -0.00488305231556 0.999988079071 vn 0.0 -0.458033323288 0.888935029507 vn -0.438159108162 -0.44954264164 0.778413772583 vn 0.0 -0.00488305231556 0.999988079071 vn -0.438159108162 -0.44954264164 0.778413772583 vn -0.132545530796 -0.000366232183296 0.991176843643 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.0 -0.458033323288 0.888935029507 vn 0.0 -0.00488305231556 0.999988079071 vn 0.438159108162 -0.44954264164 0.778413772583 vn 0.0 -0.00488305231556 0.999988079071 vn 0.132545530796 -0.000366232183296 0.991176843643 vn -0.565191209316 -0.0297260265797 0.824424207211 vn -0.518215894699 -0.244580805302 0.819531917572 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.565191209316 -0.0297260265797 0.824424207211 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.181707963347 -0.0454117320478 0.982303380966 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.518215894699 -0.244580805302 0.819531917572 vn 0.565191209316 -0.0297260265797 0.824424207211 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.565191209316 -0.0297260265797 0.824424207211 vn 0.181707963347 -0.0454117320478 0.982303380966 vn -0.181707963347 -0.0454117320478 0.982303380966 vn -0.132545530796 -0.000366232183296 0.991176843643 vn -0.580199599266 0.0743141323328 0.811076939106 vn -0.181707963347 -0.0454117320478 0.982303380966 vn -0.580199599266 0.0743141323328 0.811076939106 vn -0.565191209316 -0.0297260265797 0.824424207211 vn 0.580199599266 0.0743141323328 0.811076939106 vn 0.132545530796 -0.000366232183296 0.991176843643 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.580199599266 0.0743141323328 0.811076939106 vn 0.181707963347 -0.0454117320478 0.982303380966 vn 0.565191209316 -0.0297260265797 0.824424207211 vn -0.340687721968 -0.636420428753 0.692026674747 vn -0.197186246514 -0.28941604495 0.93667280674 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.340687721968 -0.636420428753 0.692026674747 vn -0.145730406046 -0.136971324682 0.979796648026 vn -0.518215894699 -0.244580805302 0.819531917572 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.197186246514 -0.28941604495 0.93667280674 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.145730406046 -0.136971324682 0.979796648026 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.518215894699 -0.244580805302 0.819531917572 vn -0.155464783311 -0.765757203102 0.624056577682 vn 0.0588713921607 -0.378437191248 0.923752903938 vn -0.197186246514 -0.28941604495 0.93667280674 vn -0.155464783311 -0.765757203102 0.624056577682 vn -0.197186246514 -0.28941604495 0.93667280674 vn -0.340687721968 -0.636420428753 0.692026674747 vn 0.197186246514 -0.28941604495 0.93667280674 vn -0.0588713921607 -0.378437191248 0.923752903938 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.197186246514 -0.28941604495 0.93667280674 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.0 -0.782085120678 0.623171627522 vn 0.0 -0.346517056227 0.938043653965 vn 0.0588713921607 -0.378437191248 0.923752903938 vn 0.0 -0.782085120678 0.623171627522 vn 0.0588713921607 -0.378437191248 0.923752903938 vn -0.155464783311 -0.765757203102 0.624056577682 vn -0.0588713921607 -0.378437191248 0.923752903938 vn 0.0 -0.346517056227 0.938043653965 vn 0.0 -0.782085120678 0.623171627522 vn -0.0588713921607 -0.378437191248 0.923752903938 vn 0.0 -0.782085120678 0.623171627522 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.221081703901 -0.165658667684 0.961082756519 vn 0.299305289984 -0.282214343548 0.911466598511 vn 0.0 0.0755645632744 0.997140884399 vn 0.221081703901 -0.165658667684 0.961082756519 vn 0.0 0.0755645632744 0.997140884399 vn 0.0 -0.24067530036 0.970605671406 vn 0.0 0.0755645632744 0.997140884399 vn -0.299305289984 -0.282214343548 0.911466598511 vn -0.221081703901 -0.165658667684 0.961082756519 vn 0.0 0.0755645632744 0.997140884399 vn -0.221081703901 -0.165658667684 0.961082756519 vn 0.0 -0.24067530036 0.970605671406 vn 0.0 -0.24067530036 0.970605671406 vn 0.0 -0.0726046860218 0.997360825539 vn 0.00100711360574 -0.120029628277 0.992769777775 vn 0.0 -0.24067530036 0.970605671406 vn 0.00100711360574 -0.120029628277 0.992769777775 vn 0.221081703901 -0.165658667684 0.961082756519 vn -0.00100711360574 -0.120029628277 0.992769777775 vn 0.0 -0.0726046860218 0.997360825539 vn 0.0 -0.24067530036 0.970605671406 vn -0.00100711360574 -0.120029628277 0.992769777775 vn 0.0 -0.24067530036 0.970605671406 vn -0.221081703901 -0.165658667684 0.961082756519 vn 0.0 -0.0726046860218 0.997360825539 vn -0.748703360558 -0.66007488966 0.0611915178597 vn -0.288341939449 -0.214181184769 0.933265984058 vn 0.0 -0.0726046860218 0.997360825539 vn -0.288341939449 -0.214181184769 0.933265984058 vn 0.00100711360574 -0.120029628277 0.992769777775 vn 0.288341939449 -0.214181184769 0.933265984058 vn 0.748703360558 -0.66007488966 0.0611915178597 vn 0.0 -0.0726046860218 0.997360825539 vn 0.288341939449 -0.214181184769 0.933265984058 vn 0.0 -0.0726046860218 0.997360825539 vn -0.00100711360574 -0.120029628277 0.992769777775 vn 0.0 0.0755645632744 0.997140884399 vn 0.299305289984 -0.282214343548 0.911466598511 vn 0.125035598874 -0.32401829958 0.937751710415 vn 0.0 0.0755645632744 0.997140884399 vn 0.125035598874 -0.32401829958 0.937751710415 vn -0.23539313674 0.297224640846 -0.925336480141 vn -0.125035598874 -0.32401829958 0.937751710415 vn -0.299305289984 -0.282214343548 0.911466598511 vn 0.0 0.0755645632744 0.997140884399 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.0 0.0755645632744 0.997140884399 vn 0.23539313674 0.297224640846 -0.925336480141 vn -0.357385545969 -0.553779780865 0.752066195011 vn -0.23539313674 0.297224640846 -0.925336480141 vn 0.125035598874 -0.32401829958 0.937751710415 vn -0.357385545969 -0.553779780865 0.752066195011 vn 0.125035598874 -0.32401829958 0.937751710415 vn -0.153695300221 -0.49743437767 0.853777945042 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.23539313674 0.297224640846 -0.925336480141 vn 0.357385545969 -0.553779780865 0.752066195011 vn -0.125035598874 -0.32401829958 0.937751710415 vn 0.357385545969 -0.553779780865 0.752066195011 vn 0.153695300221 -0.49743437767 0.853777945042 vn -0.484950751066 -0.373280823231 0.790875613689 vn -0.357385545969 -0.553779780865 0.752066195011 vn -0.153695300221 -0.49743437767 0.853777945042 vn -0.484950751066 -0.373280823231 0.790875613689 vn -0.153695300221 -0.49743437767 0.853777945042 vn -0.435573518276 -0.359366476536 0.825306892395 vn 0.153695300221 -0.49743437767 0.853777945042 vn 0.357385545969 -0.553779780865 0.752066195011 vn 0.484950751066 -0.373280823231 0.790875613689 vn 0.153695300221 -0.49743437767 0.853777945042 vn 0.484950751066 -0.373280823231 0.790875613689 vn 0.435573518276 -0.359366476536 0.825306892395 vn -0.62497484684 -0.317126363516 0.713328301907 vn -0.484950751066 -0.373280823231 0.790875613689 vn -0.435573518276 -0.359366476536 0.825306892395 vn -0.62497484684 -0.317126363516 0.713328301907 vn -0.435573518276 -0.359366476536 0.825306892395 vn -0.446432203054 -0.248150140047 0.859720766544 vn 0.435573518276 -0.359366476536 0.825306892395 vn 0.484950751066 -0.373280823231 0.790875613689 vn 0.62497484684 -0.317126363516 0.713328301907 vn 0.435573518276 -0.359366476536 0.825306892395 vn 0.62497484684 -0.317126363516 0.713328301907 vn 0.446432203054 -0.248150140047 0.859720766544 vn -0.525021135807 -0.43767529726 0.72992682457 vn -0.62497484684 -0.317126363516 0.713328301907 vn -0.446432203054 -0.248150140047 0.859720766544 vn -0.525021135807 -0.43767529726 0.72992682457 vn -0.446432203054 -0.248150140047 0.859720766544 vn -0.207711651921 -0.12143471837 0.970623254776 vn 0.446432203054 -0.248150140047 0.859720766544 vn 0.62497484684 -0.317126363516 0.713328301907 vn 0.525021135807 -0.43767529726 0.72992682457 vn 0.446432203054 -0.248150140047 0.859720766544 vn 0.525021135807 -0.43767529726 0.72992682457 vn 0.207711651921 -0.12143471837 0.970623254776 vn -0.345075637102 -0.068087361753 0.936101973057 vn -0.525021135807 -0.43767529726 0.72992682457 vn -0.207711651921 -0.12143471837 0.970623254776 vn -0.345075637102 -0.068087361753 0.936101973057 vn -0.207711651921 -0.12143471837 0.970623254776 vn -0.0815470069647 -0.288313835859 0.954057216644 vn 0.207711651921 -0.12143471837 0.970623254776 vn 0.525021135807 -0.43767529726 0.72992682457 vn 0.345075637102 -0.068087361753 0.936101973057 vn 0.207711651921 -0.12143471837 0.970623254776 vn 0.345075637102 -0.068087361753 0.936101973057 vn 0.0815470069647 -0.288313835859 0.954057216644 vn -0.286604106426 -0.0252087116241 0.957717418671 vn -0.345075637102 -0.068087361753 0.936101973057 vn -0.0815470069647 -0.288313835859 0.954057216644 vn -0.286604106426 -0.0252087116241 0.957717418671 vn -0.0815470069647 -0.288313835859 0.954057216644 vn -0.231181889772 0.093571446836 0.968400418758 vn 0.0815470069647 -0.288313835859 0.954057216644 vn 0.345075637102 -0.068087361753 0.936101973057 vn 0.286604106426 -0.0252087116241 0.957717418671 vn 0.0815470069647 -0.288313835859 0.954057216644 vn 0.286604106426 -0.0252087116241 0.957717418671 vn 0.231181889772 0.093571446836 0.968400418758 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.286604106426 -0.0252087116241 0.957717418671 vn -0.231181889772 0.093571446836 0.968400418758 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.231181889772 0.093571446836 0.968400418758 vn -0.17600402236 -0.134345367551 0.975178897381 vn 0.231181889772 0.093571446836 0.968400418758 vn 0.286604106426 -0.0252087116241 0.957717418671 vn 0.274217098951 0.208569794893 0.93877774477 vn 0.231181889772 0.093571446836 0.968400418758 vn 0.274217098951 0.208569794893 0.93877774477 vn 0.17600402236 -0.134345367551 0.975178897381 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.17600402236 -0.134345367551 0.975178897381 vn -0.213939204812 -0.120062313974 0.969440579414 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.213939204812 -0.120062313974 0.969440579414 vn 0.130256786942 0.157571643591 0.978879153728 vn 0.213939204812 -0.120062313974 0.969440579414 vn 0.17600402236 -0.134345367551 0.975178897381 vn 0.274217098951 0.208569794893 0.93877774477 vn 0.213939204812 -0.120062313974 0.969440579414 vn 0.274217098951 0.208569794893 0.93877774477 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.130256786942 0.157571643591 0.978879153728 vn -0.213939204812 -0.120062313974 0.969440579414 vn -0.288341939449 -0.214181184769 0.933265984058 vn 0.130256786942 0.157571643591 0.978879153728 vn -0.288341939449 -0.214181184769 0.933265984058 vn -0.748703360558 -0.66007488966 0.0611915178597 vn 0.288341939449 -0.214181184769 0.933265984058 vn 0.213939204812 -0.120062313974 0.969440579414 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.288341939449 -0.214181184769 0.933265984058 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.748703360558 -0.66007488966 0.0611915178597 vn 0.0 -0.0726046860218 0.997360825539 vn 0.0 0.970514774323 0.241041690111 vn 0.833715498447 0.538322985172 0.122991189361 vn 0.0 -0.0726046860218 0.997360825539 vn 0.833715498447 0.538322985172 0.122991189361 vn -0.748703360558 -0.66007488966 0.0611915178597 vn -0.833715498447 0.538322985172 0.122991189361 vn 0.0 0.970514774323 0.241041690111 vn 0.0 -0.0726046860218 0.997360825539 vn -0.833715498447 0.538322985172 0.122991189361 vn 0.0 -0.0726046860218 0.997360825539 vn 0.748703360558 -0.66007488966 0.0611915178597 vn -0.748703360558 -0.66007488966 0.0611915178597 vn 0.833715498447 0.538322985172 0.122991189361 vn 0.596377015114 0.778455018997 0.195811629295 vn -0.748703360558 -0.66007488966 0.0611915178597 vn 0.596377015114 0.778455018997 0.195811629295 vn 0.130256786942 0.157571643591 0.978879153728 vn -0.596377015114 0.778455018997 0.195811629295 vn -0.833715498447 0.538322985172 0.122991189361 vn 0.748703360558 -0.66007488966 0.0611915178597 vn -0.596377015114 0.778455018997 0.195811629295 vn 0.748703360558 -0.66007488966 0.0611915178597 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.130256786942 0.157571643591 0.978879153728 vn 0.596377015114 0.778455018997 0.195811629295 vn -0.224104270339 0.960202753544 0.166697189212 vn 0.130256786942 0.157571643591 0.978879153728 vn -0.224104270339 0.960202753544 0.166697189212 vn -0.274217098951 0.208569794893 0.93877774477 vn 0.224104270339 0.960202753544 0.166697189212 vn -0.596377015114 0.778455018997 0.195811629295 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.224104270339 0.960202753544 0.166697189212 vn -0.130256786942 0.157571643591 0.978879153728 vn 0.274217098951 0.208569794893 0.93877774477 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.224104270339 0.960202753544 0.166697189212 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.274217098951 0.208569794893 0.93877774477 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.286604106426 -0.0252087116241 0.957717418671 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.224104270339 0.960202753544 0.166697189212 vn 0.274217098951 0.208569794893 0.93877774477 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.274217098951 0.208569794893 0.93877774477 vn 0.286604106426 -0.0252087116241 0.957717418671 vn -0.286604106426 -0.0252087116241 0.957717418671 vn -0.597628355026 0.783795833588 0.168832600117 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.286604106426 -0.0252087116241 0.957717418671 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.345075637102 -0.068087361753 0.936101973057 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.597628355026 0.783795833588 0.168832600117 vn 0.286604106426 -0.0252087116241 0.957717418671 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.286604106426 -0.0252087116241 0.957717418671 vn 0.345075637102 -0.068087361753 0.936101973057 vn -0.345075637102 -0.068087361753 0.936101973057 vn -0.436060249805 0.886311948299 0.15589274466 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.345075637102 -0.068087361753 0.936101973057 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.525021135807 -0.43767529726 0.72992682457 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.436060249805 0.886311948299 0.15589274466 vn 0.345075637102 -0.068087361753 0.936101973057 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.345075637102 -0.068087361753 0.936101973057 vn 0.525021135807 -0.43767529726 0.72992682457 vn -0.525021135807 -0.43767529726 0.72992682457 vn -0.14753049612 0.826250076294 -0.543640971184 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.525021135807 -0.43767529726 0.72992682457 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.62497484684 -0.317126363516 0.713328301907 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.14753049612 0.826250076294 -0.543640971184 vn 0.525021135807 -0.43767529726 0.72992682457 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.525021135807 -0.43767529726 0.72992682457 vn 0.62497484684 -0.317126363516 0.713328301907 vn -0.62497484684 -0.317126363516 0.713328301907 vn -0.921397447586 -0.366746157408 -0.128545790911 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.62497484684 -0.317126363516 0.713328301907 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.484950751066 -0.373280823231 0.790875613689 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.921397447586 -0.366746157408 -0.128545790911 vn 0.62497484684 -0.317126363516 0.713328301907 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.62497484684 -0.317126363516 0.713328301907 vn 0.484950751066 -0.373280823231 0.790875613689 vn -0.484950751066 -0.373280823231 0.790875613689 vn -0.561698913574 -0.79580873251 0.226236015558 vn -0.335889905691 -0.941779613495 -0.0151373241097 vn -0.484950751066 -0.373280823231 0.790875613689 vn -0.335889905691 -0.941779613495 -0.0151373241097 vn -0.357385545969 -0.553779780865 0.752066195011 vn 0.335889905691 -0.941779613495 -0.0151373241097 vn 0.561698913574 -0.79580873251 0.226236015558 vn 0.484950751066 -0.373280823231 0.790875613689 vn 0.335889905691 -0.941779613495 -0.0151373241097 vn 0.484950751066 -0.373280823231 0.790875613689 vn 0.357385545969 -0.553779780865 0.752066195011 vn -0.357385545969 -0.553779780865 0.752066195011 vn -0.335889905691 -0.941779613495 -0.0151373241097 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.357385545969 -0.553779780865 0.752066195011 vn 0.528981745243 -0.848055362701 -0.0313122533262 vn -0.23539313674 0.297224640846 -0.925336480141 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.335889905691 -0.941779613495 -0.0151373241097 vn 0.357385545969 -0.553779780865 0.752066195011 vn -0.528981745243 -0.848055362701 -0.0313122533262 vn 0.357385545969 -0.553779780865 0.752066195011 vn 0.23539313674 0.297224640846 -0.925336480141 vn -0.565191209316 -0.0297260265797 0.824424207211 vn -0.580199599266 0.0743141323328 0.811076939106 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.565191209316 -0.0297260265797 0.824424207211 vn -0.965075433254 0.222331747413 0.138556778431 vn -0.972817361355 0.10031530261 0.208718091249 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.580199599266 0.0743141323328 0.811076939106 vn 0.565191209316 -0.0297260265797 0.824424207211 vn 0.965075433254 0.222331747413 0.138556778431 vn 0.565191209316 -0.0297260265797 0.824424207211 vn 0.972817361355 0.10031530261 0.208718091249 vn -0.518215894699 -0.244580805302 0.819531917572 vn -0.565191209316 -0.0297260265797 0.824424207211 vn -0.972817361355 0.10031530261 0.208718091249 vn -0.518215894699 -0.244580805302 0.819531917572 vn -0.972817361355 0.10031530261 0.208718091249 vn -0.945738434792 -0.257859289646 0.197705358267 vn 0.972817361355 0.10031530261 0.208718091249 vn 0.565191209316 -0.0297260265797 0.824424207211 vn 0.518215894699 -0.244580805302 0.819531917572 vn 0.972817361355 0.10031530261 0.208718091249 vn 0.518215894699 -0.244580805302 0.819531917572 vn 0.945738434792 -0.257859289646 0.197705358267 vn -0.340687721968 -0.636420428753 0.692026674747 vn -0.518215894699 -0.244580805302 0.819531917572 vn -0.945738434792 -0.257859289646 0.197705358267 vn -0.340687721968 -0.636420428753 0.692026674747 vn -0.945738434792 -0.257859289646 0.197705358267 vn -0.525359153748 -0.83525210619 0.162332117558 vn 0.945738434792 -0.257859289646 0.197705358267 vn 0.518215894699 -0.244580805302 0.819531917572 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.945738434792 -0.257859289646 0.197705358267 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.525359153748 -0.83525210619 0.162332117558 vn -0.155464783311 -0.765757203102 0.624056577682 vn -0.340687721968 -0.636420428753 0.692026674747 vn -0.525359153748 -0.83525210619 0.162332117558 vn -0.155464783311 -0.765757203102 0.624056577682 vn -0.525359153748 -0.83525210619 0.162332117558 vn -0.161264792085 -0.973448514938 0.162455067039 vn 0.525359153748 -0.83525210619 0.162332117558 vn 0.340687721968 -0.636420428753 0.692026674747 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.525359153748 -0.83525210619 0.162332117558 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.782085120678 0.623171627522 vn -0.155464783311 -0.765757203102 0.624056577682 vn -0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.782085120678 0.623171627522 vn -0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.964891910553 0.262647390366 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.155464783311 -0.765757203102 0.624056577682 vn 0.0 -0.782085120678 0.623171627522 vn 0.161264792085 -0.973448514938 0.162455067039 vn 0.0 -0.782085120678 0.623171627522 vn 0.0 -0.964891910553 0.262647390366 vn 0.394005328417 0.0176402088255 0.918938875198 vn -0.969222545624 -0.026154788211 0.244792938232 vn -0.729017734528 -0.656595110893 0.193432182074 vn 0.394005328417 0.0176402088255 0.918938875198 vn -0.729017734528 -0.656595110893 0.193432182074 vn 0.11484221369 0.360335379839 0.925726532936 vn 0.729017734528 -0.656595110893 0.193432182074 vn 0.969222545624 -0.026154788211 0.244792938232 vn -0.394005328417 0.0176402088255 0.918938875198 vn 0.729017734528 -0.656595110893 0.193432182074 vn -0.394005328417 0.0176402088255 0.918938875198 vn -0.11484221369 0.360335379839 0.925726532936 vn 0.11484221369 0.360335379839 0.925726532936 vn -0.729017734528 -0.656595110893 0.193432182074 vn -0.0314045287669 -0.966978728771 0.252914816141 vn 0.11484221369 0.360335379839 0.925726532936 vn -0.0314045287669 -0.966978728771 0.252914816141 vn -0.210918188095 0.408316344023 0.888139247894 vn 0.0314045287669 -0.966978728771 0.252914816141 vn 0.729017734528 -0.656595110893 0.193432182074 vn -0.11484221369 0.360335379839 0.925726532936 vn 0.0314045287669 -0.966978728771 0.252914816141 vn -0.11484221369 0.360335379839 0.925726532936 vn 0.210918188095 0.408316344023 0.888139247894 vn -0.210918188095 0.408316344023 0.888139247894 vn -0.0314045287669 -0.966978728771 0.252914816141 vn 0.650581777096 -0.688273251057 0.320972412825 vn -0.210918188095 0.408316344023 0.888139247894 vn 0.650581777096 -0.688273251057 0.320972412825 vn -0.430170893669 0.299425840378 0.851643800735 vn -0.650581777096 -0.688273251057 0.320972412825 vn 0.0314045287669 -0.966978728771 0.252914816141 vn 0.210918188095 0.408316344023 0.888139247894 vn -0.650581777096 -0.688273251057 0.320972412825 vn 0.210918188095 0.408316344023 0.888139247894 vn 0.430170893669 0.299425840378 0.851643800735 vn -0.430170893669 0.299425840378 0.851643800735 vn 0.650581777096 -0.688273251057 0.320972412825 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn -0.430170893669 0.299425840378 0.851643800735 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn -0.474120676517 0.0148019650951 0.880335450172 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn -0.650581777096 -0.688273251057 0.320972412825 vn 0.430170893669 0.299425840378 0.851643800735 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn 0.430170893669 0.299425840378 0.851643800735 vn 0.474120676517 0.0148019650951 0.880335450172 vn -0.474120676517 0.0148019650951 0.880335450172 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn 0.65277838707 0.690164625645 0.312335044146 vn -0.474120676517 0.0148019650951 0.880335450172 vn 0.65277838707 0.690164625645 0.312335044146 vn -0.431019723415 -0.307906121016 0.848183810711 vn -0.65277838707 0.690164625645 0.312335044146 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn 0.474120676517 0.0148019650951 0.880335450172 vn -0.65277838707 0.690164625645 0.312335044146 vn 0.474120676517 0.0148019650951 0.880335450172 vn 0.431019723415 -0.307906121016 0.848183810711 vn -0.431019723415 -0.307906121016 0.848183810711 vn 0.65277838707 0.690164625645 0.312335044146 vn -0.0433371253312 0.971331477165 0.23374581337 vn -0.431019723415 -0.307906121016 0.848183810711 vn -0.0433371253312 0.971331477165 0.23374581337 vn -0.218181833625 -0.40648534894 0.887223958969 vn 0.0433371253312 0.971331477165 0.23374581337 vn -0.65277838707 0.690164625645 0.312335044146 vn 0.431019723415 -0.307906121016 0.848183810711 vn 0.0433371253312 0.971331477165 0.23374581337 vn 0.431019723415 -0.307906121016 0.848183810711 vn 0.218181833625 -0.40648534894 0.887223958969 vn -0.218181833625 -0.40648534894 0.887223958969 vn -0.0433371253312 0.971331477165 0.23374581337 vn -0.71619617939 0.677070438862 0.169229462743 vn -0.218181833625 -0.40648534894 0.887223958969 vn -0.71619617939 0.677070438862 0.169229462743 vn 0.125890552998 -0.366288095713 0.921946108341 vn 0.71619617939 0.677070438862 0.169229462743 vn 0.0433371253312 0.971331477165 0.23374581337 vn 0.218181833625 -0.40648534894 0.887223958969 vn 0.71619617939 0.677070438862 0.169229462743 vn 0.218181833625 -0.40648534894 0.887223958969 vn -0.125890552998 -0.366288095713 0.921946108341 vn 0.125890552998 -0.366288095713 0.921946108341 vn -0.71619617939 0.677070438862 0.169229462743 vn -0.969222545624 -0.026154788211 0.244792938232 vn 0.125890552998 -0.366288095713 0.921946108341 vn -0.969222545624 -0.026154788211 0.244792938232 vn 0.394005328417 0.0176402088255 0.918938875198 vn 0.969222545624 -0.026154788211 0.244792938232 vn 0.71619617939 0.677070438862 0.169229462743 vn -0.125890552998 -0.366288095713 0.921946108341 vn 0.969222545624 -0.026154788211 0.244792938232 vn -0.125890552998 -0.366288095713 0.921946108341 vn -0.394005328417 0.0176402088255 0.918938875198 vn -0.801925897598 -0.00302141346037 0.597415864468 vn -0.969222545624 -0.026154788211 0.244792938232 vn -0.71619617939 0.677070438862 0.169229462743 vn -0.801925897598 -0.00302141346037 0.597415864468 vn -0.71619617939 0.677070438862 0.169229462743 vn -0.609812736511 0.49222061038 0.621166050434 vn 0.71619617939 0.677070438862 0.169229462743 vn 0.969222545624 -0.026154788211 0.244792938232 vn 0.801925897598 -0.00302141346037 0.597415864468 vn 0.71619617939 0.677070438862 0.169229462743 vn 0.801925897598 -0.00302141346037 0.597415864468 vn 0.609812736511 0.49222061038 0.621166050434 vn -0.867532372475 -0.00360123906285 0.497367709875 vn -0.801925897598 -0.00302141346037 0.597415864468 vn -0.609812736511 0.49222061038 0.621166050434 vn -0.867532372475 -0.00360123906285 0.497367709875 vn -0.609812736511 0.49222061038 0.621166050434 vn -0.672675549984 0.53472840786 0.511442184448 vn 0.609812736511 0.49222061038 0.621166050434 vn 0.801925897598 -0.00302141346037 0.597415864468 vn 0.867532372475 -0.00360123906285 0.497367709875 vn 0.609812736511 0.49222061038 0.621166050434 vn 0.867532372475 -0.00360123906285 0.497367709875 vn 0.672675549984 0.53472840786 0.511442184448 vn -0.672675549984 0.53472840786 0.511442184448 vn -0.609812736511 0.49222061038 0.621166050434 vn -0.100866347551 0.739574670792 0.665473759174 vn -0.672675549984 0.53472840786 0.511442184448 vn -0.100866347551 0.739574670792 0.665473759174 vn -0.116338938475 0.843518316746 0.524349212646 vn 0.100866347551 0.739574670792 0.665473759174 vn 0.609812736511 0.49222061038 0.621166050434 vn 0.672675549984 0.53472840786 0.511442184448 vn 0.100866347551 0.739574670792 0.665473759174 vn 0.672675549984 0.53472840786 0.511442184448 vn 0.116338938475 0.843518316746 0.524349212646 vn -0.609812736511 0.49222061038 0.621166050434 vn -0.71619617939 0.677070438862 0.169229462743 vn -0.0433371253312 0.971331477165 0.23374581337 vn -0.609812736511 0.49222061038 0.621166050434 vn -0.0433371253312 0.971331477165 0.23374581337 vn -0.100866347551 0.739574670792 0.665473759174 vn 0.0433371253312 0.971331477165 0.23374581337 vn 0.71619617939 0.677070438862 0.169229462743 vn 0.609812736511 0.49222061038 0.621166050434 vn 0.0433371253312 0.971331477165 0.23374581337 vn 0.609812736511 0.49222061038 0.621166050434 vn 0.100866347551 0.739574670792 0.665473759174 vn -0.100866347551 0.739574670792 0.665473759174 vn -0.0433371253312 0.971331477165 0.23374581337 vn 0.65277838707 0.690164625645 0.312335044146 vn -0.100866347551 0.739574670792 0.665473759174 vn 0.65277838707 0.690164625645 0.312335044146 vn 0.460327893496 0.525212705135 0.715716302395 vn -0.65277838707 0.690164625645 0.312335044146 vn 0.0433371253312 0.971331477165 0.23374581337 vn 0.100866347551 0.739574670792 0.665473759174 vn -0.65277838707 0.690164625645 0.312335044146 vn 0.100866347551 0.739574670792 0.665473759174 vn -0.460327893496 0.525212705135 0.715716302395 vn -0.116338938475 0.843518316746 0.524349212646 vn -0.100866347551 0.739574670792 0.665473759174 vn 0.460327893496 0.525212705135 0.715716302395 vn -0.116338938475 0.843518316746 0.524349212646 vn 0.460327893496 0.525212705135 0.715716302395 vn 0.525057256222 0.625466346741 0.577153980732 vn -0.460327893496 0.525212705135 0.715716302395 vn 0.100866347551 0.739574670792 0.665473759174 vn 0.116338938475 0.843518316746 0.524349212646 vn -0.460327893496 0.525212705135 0.715716302395 vn 0.116338938475 0.843518316746 0.524349212646 vn -0.525057256222 0.625466346741 0.577153980732 vn 0.525057256222 0.625466346741 0.577153980732 vn 0.460327893496 0.525212705135 0.715716302395 vn 0.688478529453 0.00198373640887 0.725253999233 vn 0.525057256222 0.625466346741 0.577153980732 vn 0.688478529453 0.00198373640887 0.725253999233 vn 0.811937272549 -0.000915581011213 0.583743929863 vn -0.688478529453 0.00198373640887 0.725253999233 vn -0.460327893496 0.525212705135 0.715716302395 vn -0.525057256222 0.625466346741 0.577153980732 vn -0.688478529453 0.00198373640887 0.725253999233 vn -0.525057256222 0.625466346741 0.577153980732 vn -0.811937272549 -0.000915581011213 0.583743929863 vn 0.460327893496 0.525212705135 0.715716302395 vn 0.65277838707 0.690164625645 0.312335044146 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn 0.460327893496 0.525212705135 0.715716302395 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn 0.688478529453 0.00198373640887 0.725253999233 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn -0.65277838707 0.690164625645 0.312335044146 vn -0.460327893496 0.525212705135 0.715716302395 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn -0.460327893496 0.525212705135 0.715716302395 vn -0.688478529453 0.00198373640887 0.725253999233 vn 0.688478529453 0.00198373640887 0.725253999233 vn 0.198071315885 -0.0229506343603 -0.979918897152 vn 0.650581777096 -0.688273251057 0.320972412825 vn 0.688478529453 0.00198373640887 0.725253999233 vn 0.650581777096 -0.688273251057 0.320972412825 vn 0.451956272125 -0.53774523735 0.711734235287 vn -0.650581777096 -0.688273251057 0.320972412825 vn -0.198071315885 -0.0229506343603 -0.979918897152 vn -0.688478529453 0.00198373640887 0.725253999233 vn -0.650581777096 -0.688273251057 0.320972412825 vn -0.688478529453 0.00198373640887 0.725253999233 vn -0.451956272125 -0.53774523735 0.711734235287 vn 0.811937272549 -0.000915581011213 0.583743929863 vn 0.688478529453 0.00198373640887 0.725253999233 vn 0.451956272125 -0.53774523735 0.711734235287 vn 0.811937272549 -0.000915581011213 0.583743929863 vn 0.451956272125 -0.53774523735 0.711734235287 vn 0.552884638309 -0.638002514839 0.535977005959 vn -0.451956272125 -0.53774523735 0.711734235287 vn -0.688478529453 0.00198373640887 0.725253999233 vn -0.811937272549 -0.000915581011213 0.583743929863 vn -0.451956272125 -0.53774523735 0.711734235287 vn -0.811937272549 -0.000915581011213 0.583743929863 vn -0.552884638309 -0.638002514839 0.535977005959 vn 0.552884638309 -0.638002514839 0.535977005959 vn 0.451956272125 -0.53774523735 0.711734235287 vn -0.0994920507073 -0.751470208168 0.652222275734 vn 0.552884638309 -0.638002514839 0.535977005959 vn -0.0994920507073 -0.751470208168 0.652222275734 vn -0.119328700006 -0.871160566807 0.476277172565 vn 0.0994920507073 -0.751470208168 0.652222275734 vn -0.451956272125 -0.53774523735 0.711734235287 vn -0.552884638309 -0.638002514839 0.535977005959 vn 0.0994920507073 -0.751470208168 0.652222275734 vn -0.552884638309 -0.638002514839 0.535977005959 vn 0.119328700006 -0.871160566807 0.476277172565 vn 0.451956272125 -0.53774523735 0.711734235287 vn 0.650581777096 -0.688273251057 0.320972412825 vn -0.0314045287669 -0.966978728771 0.252914816141 vn 0.451956272125 -0.53774523735 0.711734235287 vn -0.0314045287669 -0.966978728771 0.252914816141 vn -0.0994920507073 -0.751470208168 0.652222275734 vn 0.0314045287669 -0.966978728771 0.252914816141 vn -0.650581777096 -0.688273251057 0.320972412825 vn -0.451956272125 -0.53774523735 0.711734235287 vn 0.0314045287669 -0.966978728771 0.252914816141 vn -0.451956272125 -0.53774523735 0.711734235287 vn 0.0994920507073 -0.751470208168 0.652222275734 vn -0.0994920507073 -0.751470208168 0.652222275734 vn -0.0314045287669 -0.966978728771 0.252914816141 vn -0.729017734528 -0.656595110893 0.193432182074 vn -0.0994920507073 -0.751470208168 0.652222275734 vn -0.729017734528 -0.656595110893 0.193432182074 vn -0.607638299465 -0.510403931141 0.608492851257 vn 0.729017734528 -0.656595110893 0.193432182074 vn 0.0314045287669 -0.966978728771 0.252914816141 vn 0.0994920507073 -0.751470208168 0.652222275734 vn 0.729017734528 -0.656595110893 0.193432182074 vn 0.0994920507073 -0.751470208168 0.652222275734 vn 0.607638299465 -0.510403931141 0.608492851257 vn -0.119328700006 -0.871160566807 0.476277172565 vn -0.0994920507073 -0.751470208168 0.652222275734 vn -0.607638299465 -0.510403931141 0.608492851257 vn -0.119328700006 -0.871160566807 0.476277172565 vn -0.607638299465 -0.510403931141 0.608492851257 vn -0.680181026459 -0.546262860298 0.488825768232 vn 0.607638299465 -0.510403931141 0.608492851257 vn 0.0994920507073 -0.751470208168 0.652222275734 vn 0.119328700006 -0.871160566807 0.476277172565 vn 0.607638299465 -0.510403931141 0.608492851257 vn 0.119328700006 -0.871160566807 0.476277172565 vn 0.680181026459 -0.546262860298 0.488825768232 vn -0.680181026459 -0.546262860298 0.488825768232 vn -0.607638299465 -0.510403931141 0.608492851257 vn -0.801925897598 -0.00302141346037 0.597415864468 vn -0.680181026459 -0.546262860298 0.488825768232 vn -0.801925897598 -0.00302141346037 0.597415864468 vn -0.867532372475 -0.00360123906285 0.497367709875 vn 0.801925897598 -0.00302141346037 0.597415864468 vn 0.607638299465 -0.510403931141 0.608492851257 vn 0.680181026459 -0.546262860298 0.488825768232 vn 0.801925897598 -0.00302141346037 0.597415864468 vn 0.680181026459 -0.546262860298 0.488825768232 vn 0.867532372475 -0.00360123906285 0.497367709875 vn -0.607638299465 -0.510403931141 0.608492851257 vn -0.729017734528 -0.656595110893 0.193432182074 vn -0.969222545624 -0.026154788211 0.244792938232 vn -0.607638299465 -0.510403931141 0.608492851257 vn -0.969222545624 -0.026154788211 0.244792938232 vn -0.801925897598 -0.00302141346037 0.597415864468 vn 0.969222545624 -0.026154788211 0.244792938232 vn 0.729017734528 -0.656595110893 0.193432182074 vn 0.607638299465 -0.510403931141 0.608492851257 vn 0.969222545624 -0.026154788211 0.244792938232 vn 0.607638299465 -0.510403931141 0.608492851257 vn 0.801925897598 -0.00302141346037 0.597415864468 f 61/1/1 65/2/2 49/3/3 f 50/4/4 66/5/5 62/6/6 f 63/7/7 65/8/8 61/9/9 f 62/10/10 66/11/11 64/12/12 f 61/13/13 59/14/14 63/15/15 f 64/16/16 60/17/17 62/18/18 f 61/19/19 57/20/20 59/21/21 f 60/22/22 58/23/23 62/24/24 f 61/25/25 55/26/26 57/27/27 f 58/28/28 56/29/29 62/30/30 f 61/31/31 53/32/32 55/33/33 f 56/34/34 54/35/35 62/36/36 f 61/37/37 51/38/38 53/39/39 f 54/40/40 52/41/41 62/42/42 f 61/43/43 49/44/44 51/45/45 f 52/46/46 50/47/47 62/48/48 f 225/49/49 229/50/50 227/51/51 f 228/52/52 230/53/53 226/54/54 f 73/55/55 284/56/56 74/57/57 f 74/58/58 285/59/59 73/60/60 f 342/61/61 348/62/62 384/63/63 f 385/64/64 349/65/65 343/66/66 f 300/67/67 346/68/68 344/69/69 f 345/70/70 347/71/71 301/72/72 f 324/73/73 380/74/74 352/75/75 f 353/76/76 381/77/77 325/78/78 f 442/79/79 444/80/80 446/81/81 f 447/82/82 445/83/83 443/84/84 f 464/85/85 492/86/86 466/87/87 f 467/88/88 493/89/89 465/90/90 f 496/91/91 498/92/92 500/93/93 f 501/94/94 499/95/95 497/96/96 f 505/97/97 323/98/98 321/99/99 f 505/100/100 321/101/101 391/102/102 f 320/103/103 322/104/104 504/105/105 f 320/106/106 504/107/107 390/108/108 f 505/109/109 507/110/110 315/111/111 f 505/112/112 315/113/113 323/114/114 f 314/115/115 506/116/116 504/117/117 f 314/118/118 504/119/119 322/120/120 f 389/121/121 383/122/122 315/123/123 f 389/124/124 315/125/125 507/126/126 f 314/127/127 382/128/128 388/129/129 f 314/130/130 388/131/131 506/132/132 f 501/133/133 497/134/134 495/135/135 f 501/136/136 495/137/137 503/138/138 f 494/139/139 496/140/140 500/141/141 f 494/142/142 500/143/143 502/144/144 f 505/145/145 503/146/146 495/147/147 f 505/148/148 495/149/149 507/150/150 f 494/151/151 502/152/152 504/153/153 f 494/154/154 504/155/155 506/156/156 f 495/157/157 401/158/158 389/159/159 f 495/160/160 389/161/161 507/162/162 f 388/163/163 400/164/164 494/165/165 f 388/166/166 494/167/167 506/168/168 f 497/169/169 399/170/170 401/171/171 f 497/172/172 401/173/173 495/174/174 f 400/175/175 398/176/176 496/177/177 f 400/178/178 496/179/179 494/180/180 f 499/181/181 397/182/182 399/183/183 f 499/184/184 399/185/185 497/186/186 f 398/187/187 396/188/188 498/189/189 f 398/190/190 498/191/191 496/192/192 f 501/193/193 395/194/194 397/195/195 f 501/196/196 397/197/197 499/198/198 f 396/199/199 394/200/200 500/201/201 f 396/202/202 500/203/203 498/204/204 f 503/205/205 393/206/206 395/207/207 f 503/208/208 395/209/209 501/210/210 f 394/211/211 392/212/212 502/213/213 f 394/214/214 502/215/215 500/216/216 f 505/217/217 391/218/218 393/219/219 f 505/220/220 393/221/221 503/222/222 f 392/223/223 390/224/224 504/225/225 f 392/226/226 504/227/227 502/228/228 f 491/229/229 493/230/230 467/231/231 f 491/232/232 467/233/233 469/234/234 f 466/235/235 492/236/236 490/237/237 f 466/238/238 490/239/239 468/240/240 f 489/241/241 491/242/242 469/243/243 f 489/244/244 469/245/245 471/246/246 f 468/247/247 490/248/248 488/249/249 f 468/250/250 488/251/251 470/252/252 f 483/253/253 489/254/254 471/255/255 f 483/256/256 471/257/257 473/258/258 f 470/259/259 488/260/260 482/261/261 f 470/262/262 482/263/263 472/264/264 f 481/265/265 483/266/266 473/267/267 f 481/268/268 473/269/269 475/270/270 f 472/271/271 482/272/272 480/273/273 f 472/274/274 480/275/275 474/276/276 f 481/277/277 475/278/278 455/279/279 f 481/280/280 455/281/281 457/282/282 f 454/283/283 474/284/284 480/285/285 f 454/286/286 480/287/287 456/288/288 f 463/289/289 479/290/290 459/291/291 f 463/292/292 459/293/293 461/294/294 f 458/295/295 478/296/296 462/297/297 f 458/298/298 462/299/299 460/300/300 f 479/301/301 463/302/302 453/303/303 f 479/304/304 453/305/305 485/306/306 f 452/307/307 462/308/308 478/309/309 f 452/310/310 478/311/311 484/312/312 f 487/313/313 485/314/314 453/315/315 f 487/316/316 453/317/317 477/318/318 f 452/319/319 484/320/320 486/321/321 f 452/322/322 486/323/323 476/324/324 f 487/325/325 477/326/326 465/327/327 f 487/328/328 465/329/329 493/330/330 f 464/331/331 476/332/332 486/333/333 f 464/334/334 486/335/335 492/336/336 f 491/337/337 489/338/338 487/339/339 f 491/340/340 487/341/341 493/342/342 f 486/343/343 488/344/344 490/345/345 f 486/346/346 490/347/347 492/348/348 f 489/349/349 483/350/350 485/351/351 f 489/352/352 485/353/353 487/354/354 f 484/355/355 482/356/356 488/357/357 f 484/358/358 488/359/359 486/360/360 f 483/361/361 481/362/362 479/363/363 f 483/364/364 479/365/365 485/366/366 f 478/367/367 480/368/368 482/369/369 f 478/370/370 482/371/371 484/372/372 f 481/373/373 457/374/374 459/375/375 f 481/376/376 459/377/377 479/378/378 f 458/379/379 456/380/380 480/381/381 f 458/382/382 480/383/383 478/384/384 f 473/385/385 421/386/386 419/387/387 f 473/388/388 419/389/389 475/390/390 f 418/391/391 420/392/392 472/393/393 f 418/394/394 472/395/395 474/396/396 f 471/397/397 423/398/398 421/399/399 f 471/400/400 421/401/401 473/402/402 f 420/403/403 422/404/404 470/405/405 f 420/406/406 470/407/407 472/408/408 f 469/409/409 425/410/410 423/411/411 f 469/412/412 423/413/413 471/414/414 f 422/415/415 424/416/416 468/417/417 f 422/418/418 468/419/419 470/420/420 f 467/421/421 427/422/422 425/423/423 f 467/424/424 425/425/425 469/426/426 f 424/427/427 426/428/428 466/429/429 f 424/430/430 466/431/431 468/432/432 f 465/433/433 429/434/434 427/435/435 f 465/436/436 427/437/437 467/438/438 f 426/439/439 428/440/440 464/441/441 f 426/442/442 464/443/443 466/444/444 f 477/445/445 417/446/446 429/447/447 f 477/448/448 429/449/449 465/450/450 f 428/451/451 416/452/452 476/453/453 f 428/454/454 476/455/455 464/456/456 f 475/457/457 419/458/458 441/459/459 f 475/460/460 441/461/461 455/462/462 f 440/463/463 418/464/464 474/465/465 f 440/466/466 474/467/467 454/468/468 f 455/469/469 441/470/470 439/471/471 f 455/472/472 439/473/473 457/474/474 f 438/475/475 440/476/476 454/477/477 f 438/478/478 454/479/479 456/480/480 f 457/481/481 439/482/482 437/483/483 f 457/484/484 437/485/485 459/486/486 f 436/487/487 438/488/488 456/489/489 f 436/490/490 456/491/491 458/492/492 f 459/493/493 437/494/494 435/495/495 f 459/496/496 435/497/497 461/498/498 f 434/499/499 436/500/500 458/501/501 f 434/502/502 458/503/503 460/504/504 f 461/505/505 435/506/506 433/507/507 f 461/508/508 433/509/509 463/510/510 f 432/511/511 434/512/512 460/513/513 f 432/514/514 460/515/515 462/516/516 f 463/517/517 433/518/518 451/519/519 f 463/520/520 451/521/521 453/522/522 f 450/523/523 432/524/524 462/525/525 f 450/526/526 462/527/527 452/528/528 f 453/529/529 451/530/530 417/531/531 f 453/532/532 417/533/533 477/534/534 f 416/535/535 450/536/536 452/537/537 f 416/538/538 452/539/539 476/540/540 f 447/541/541 443/542/542 313/543/543 f 447/544/544 313/545/545 449/546/546 f 312/547/547 442/548/548 446/549/549 f 312/550/550 446/551/551 448/552/552 f 431/553/553 449/554/554 313/555/555 f 431/556/556 313/557/557 383/558/558 f 312/559/559 448/560/560 430/561/561 f 312/562/562 430/563/563 382/564/564 f 451/565/565 431/566/566 415/567/567 f 451/568/568 415/569/569 417/570/570 f 414/571/571 430/572/572 450/573/573 f 414/574/574 450/575/575 416/576/576 f 433/577/577 449/578/578 431/579/579 f 433/580/580 431/581/581 451/582/582 f 430/583/583 448/584/584 432/585/585 f 430/586/586 432/587/587 450/588/588 f 447/589/589 449/590/590 433/591/591 f 447/592/592 433/593/593 435/594/594 f 432/595/595 448/596/596 446/597/597 f 432/598/598 446/599/599 434/600/600 f 439/601/601 447/602/602 435/603/603 f 439/604/604 435/605/605 437/606/606 f 434/607/607 446/608/608 438/609/609 f 434/610/610 438/611/611 436/612/612 f 445/613/613 447/614/614 439/615/615 f 445/616/616 439/617/617 441/618/618 f 438/619/619 446/620/620 444/621/621 f 438/622/622 444/623/623 440/624/624 f 441/625/625 419/626/626 413/627/627 f 441/628/628 413/629/629 445/630/630 f 412/631/631 418/632/632 440/633/633 f 412/634/634 440/635/635 444/636/636 f 415/637/637 431/638/638 383/639/639 f 415/640/640 383/641/641 389/642/642 f 382/643/643 430/644/644 414/645/645 f 382/646/646 414/647/647 388/648/648 f 443/649/649 319/650/650 311/651/651 f 443/652/652 311/653/653 313/654/654 f 310/655/655 318/656/656 442/657/657 f 310/658/658 442/659/659 312/660/660 f 413/661/661 391/662/662 321/663/663 f 413/664/664 321/665/665 445/666/666 f 320/667/667 390/668/668 412/669/669 f 320/670/670 412/671/671 444/672/672 f 445/673/673 321/674/674 319/675/675 f 445/676/676 319/677/677 443/678/678 f 318/679/679 320/680/680 444/681/681 f 318/682/682 444/683/683 442/684/684 f 417/685/685 415/686/686 403/687/687 f 417/688/688 403/689/689 429/690/690 f 402/691/691 414/692/692 416/693/693 f 402/694/694 416/695/695 428/696/696 f 427/697/697 429/698/698 403/699/699 f 427/700/700 403/701/701 405/702/702 f 402/703/703 428/704/704 426/705/705 f 402/706/706 426/707/707 404/708/708 f 425/709/709 427/710/710 405/711/711 f 425/712/712 405/713/713 407/714/714 f 404/715/715 426/716/716 424/717/717 f 404/718/718 424/719/719 406/720/720 f 423/721/721 425/722/722 407/723/723 f 423/724/724 407/725/725 409/726/726 f 406/727/727 424/728/728 422/729/729 f 406/730/730 422/731/731 408/732/732 f 421/733/733 423/734/734 409/735/735 f 421/736/736 409/737/737 411/738/738 f 408/739/739 422/740/740 420/741/741 f 408/742/742 420/743/743 410/744/744 f 419/745/745 421/746/746 411/747/747 f 419/748/748 411/749/749 413/750/750 f 410/751/751 420/752/752 418/753/753 f 410/754/754 418/755/755 412/756/756 f 413/757/757 411/758/758 393/759/759 f 413/760/760 393/761/761 391/762/762 f 392/763/763 410/764/764 412/765/765 f 392/766/766 412/767/767 390/768/768 f 411/769/769 409/770/770 395/771/771 f 411/772/772 395/773/773 393/774/774 f 394/775/775 408/776/776 410/777/777 f 394/778/778 410/779/779 392/780/780 f 409/781/781 407/782/782 397/783/783 f 409/784/784 397/785/785 395/786/786 f 396/787/787 406/788/788 408/789/789 f 396/790/790 408/791/791 394/792/792 f 407/793/793 405/794/794 399/795/795 f 407/796/796 399/797/797 397/798/798 f 398/799/799 404/800/800 406/801/801 f 398/802/802 406/803/803 396/804/804 f 405/805/805 403/806/806 401/807/807 f 405/808/808 401/809/809 399/810/810 f 400/811/811 402/812/812 404/813/813 f 400/814/814 404/815/815 398/816/816 f 415/817/817 389/818/818 401/819/819 f 415/820/820 401/821/821 403/822/822 f 400/823/823 388/824/824 414/825/825 f 400/826/826 414/827/827 402/828/828 f 381/829/829 353/830/830 351/831/831 f 381/832/832 351/833/833 387/834/834 f 350/835/835 352/836/836 380/837/837 f 350/838/838 380/839/839 386/840/840 f 381/841/841 387/842/842 321/843/843 f 381/844/844 321/845/845 323/846/846 f 320/847/847 386/848/848 380/849/849 f 320/850/850 380/851/851 322/852/852 f 381/853/853 379/854/854 317/855/855 f 381/856/856 317/857/857 325/858/858 f 316/859/859 378/860/860 380/861/861 f 316/862/862 380/863/863 324/864/864 f 381/865/865 323/866/866 315/867/867 f 381/868/868 315/869/869 379/870/870 f 314/871/871 322/872/872 380/873/873 f 314/874/874 380/875/875 378/876/876 f 343/877/877 345/878/878 301/879/879 f 343/880/880 301/881/881 385/882/882 f 300/883/883 344/884/884 342/885/885 f 300/886/886 342/887/887 384/888/888 f 385/889/889 301/890/890 299/891/891 f 385/892/892 299/893/893 319/894/894 f 298/895/895 300/896/896 384/897/897 f 298/898/898 384/899/899 318/900/900 f 387/901/901 385/902/902 319/903/903 f 387/904/904 319/905/905 321/906/906 f 318/907/907 384/908/908 386/909/909 f 318/910/910 386/911/911 320/912/912 f 387/913/913 351/914/914 349/915/915 f 387/916/916 349/917/917 385/918/918 f 348/919/919 350/920/920 386/921/921 f 348/922/922 386/923/923 384/924/924 f 371/925/925 377/926/926 315/927/927 f 371/928/928 315/929/929 383/930/930 f 314/931/931 376/932/932 370/933/933 f 314/934/934 370/935/935 382/936/936 f 371/937/937 383/938/938 313/939/939 f 371/940/940 313/941/941 369/942/942 f 312/943/943 382/944/944 370/945/945 f 312/946/946 370/947/947 368/948/948 f 369/949/949 313/950/950 311/951/951 f 369/952/952 311/953/953 363/954/954 f 310/955/955 312/956/956 368/957/957 f 310/958/958 368/959/959 362/960/960 f 311/961/961 297/962/962 295/963/963 f 311/964/964 295/965/965 363/966/966 f 294/967/967 296/968/968 310/969/969 f 294/970/970 310/971/971 362/972/972 f 361/973/973 291/974/974 285/975/975 f 361/976/976 285/977/977 74/978/978 f 284/979/979 290/980/980 360/981/981 f 284/982/982 360/983/983 74/984/984 f 289/985/985 287/986/986 285/987/987 f 289/988/988 285/989/989 291/990/990 f 284/991/991 286/992/992 288/993/993 f 284/994/994 288/995/995 290/996/996 f 359/997/997 361/998/998 74/999/999 f 359/1000/1000 74/1001/1001 302/1002/1002 f 74/1003/1003 360/1004/1004 358/1005/1005 f 74/1006/1006 358/1007/1007 302/1008/1008 f 365/1009/1009 293/1010/1010 291/1011/1011 f 365/1012/1012 291/1013/1013 361/1014/1014 f 290/1015/1015 292/1016/1016 364/1017/1017 f 290/1018/1018 364/1019/1019 360/1020/1020 f 365/1021/1021 361/1022/1022 359/1023/1023 f 365/1024/1024 359/1025/1025 367/1026/1026 f 358/1027/1027 360/1028/1028 364/1029/1029 f 358/1030/1030 364/1031/1031 366/1032/1032 f 367/1033/1033 359/1034/1034 357/1035/1035 f 367/1036/1036 357/1037/1037 373/1038/1038 f 356/1039/1039 358/1040/1040 366/1041/1041 f 356/1042/1042 366/1043/1043 372/1044/1044 f 373/1045/1045 357/1046/1046 355/1047/1047 f 373/1048/1048 355/1049/1049 375/1050/1050 f 354/1051/1051 356/1052/1052 372/1053/1053 f 354/1054/1054 372/1055/1055 374/1056/1056 f 375/1057/1057 355/1058/1058 317/1059/1059 f 375/1060/1060 317/1061/1061 379/1062/1062 f 316/1063/1063 354/1064/1064 374/1065/1065 f 316/1066/1066 374/1067/1067 378/1068/1068 f 375/1069/1069 379/1070/1070 315/1071/1071 f 375/1072/1072 315/1073/1073 377/1074/1074 f 314/1075/1075 378/1076/1076 374/1077/1077 f 314/1078/1078 374/1079/1079 376/1080/1080 f 377/1081/1081 371/1082/1082 373/1083/1083 f 377/1084/1084 373/1085/1085 375/1086/1086 f 372/1087/1087 370/1088/1088 376/1089/1089 f 372/1090/1090 376/1091/1091 374/1092/1092 f 371/1093/1093 369/1094/1094 367/1095/1095 f 371/1096/1096 367/1097/1097 373/1098/1098 f 366/1099/1099 368/1100/1100 370/1101/1101 f 366/1102/1102 370/1103/1103 372/1104/1104 f 369/1105/1105 363/1106/1106 365/1107/1107 f 369/1108/1108 365/1109/1109 367/1110/1110 f 364/1111/1111 362/1112/1112 368/1113/1113 f 364/1114/1114 368/1115/1115 366/1116/1116 f 363/1117/1117 295/1118/1118 293/1119/1119 f 363/1120/1120 293/1121/1121 365/1122/1122 f 292/1123/1123 294/1124/1124 362/1125/1125 f 292/1126/1126 362/1127/1127 364/1128/1128 f 317/1129/1129 355/1130/1130 75/1131/1131 f 317/1132/1132 75/1133/1133 76/1134/1134 f 75/1135/1135 354/1136/1136 316/1137/1137 f 75/1138/1138 316/1139/1139 76/1140/1140 f 355/1141/1141 357/1142/1142 303/1143/1143 f 355/1144/1144 303/1145/1145 75/1146/1146 f 303/1147/1147 356/1148/1148 354/1149/1149 f 303/1150/1150 354/1151/1151 75/1152/1152 f 357/1153/1153 359/1154/1154 302/1155/1155 f 357/1156/1156 302/1157/1157 303/1158/1158 f 302/1159/1159 358/1160/1160 356/1161/1161 f 302/1162/1162 356/1163/1163 303/1164/1164 f 325/1165/1165 317/1166/1166 76/1167/1167 f 325/1168/1168 76/1169/1169 77/1170/1170 f 76/1171/1171 316/1172/1172 324/1173/1173 f 76/1174/1174 324/1175/1175 77/1176/1176 f 319/1177/1177 299/1178/1178 297/1179/1179 f 319/1180/1180 297/1181/1181 311/1182/1182 f 296/1183/1183 298/1184/1184 318/1185/1185 f 296/1186/1186 318/1187/1187 310/1188/1188 f 349/1189/1189 329/1190/1190 327/1191/1191 f 349/1192/1192 327/1193/1193 343/1194/1194 f 326/1195/1195 328/1196/1196 348/1197/1197 f 326/1198/1198 348/1199/1199 342/1200/1200 f 329/1201/1201 349/1202/1202 305/1203/1203 f 329/1204/1204 305/1205/1205 309/1206/1206 f 305/1207/1207 348/1208/1208 328/1209/1209 f 305/1210/1210 328/1211/1211 309/1212/1212 f 349/1213/1213 351/1214/1214 78/1215/1215 f 349/1216/1216 78/1217/1217 305/1218/1218 f 78/1219/1219 350/1220/1220 348/1221/1221 f 78/1222/1222 348/1223/1223 305/1224/1224 f 351/1225/1225 353/1226/1226 304/1227/1227 f 351/1228/1228 304/1229/1229 78/1230/1230 f 304/1231/1231 352/1232/1232 350/1233/1233 f 304/1234/1234 350/1235/1235 78/1236/1236 f 353/1237/1237 325/1238/1238 77/1239/1239 f 353/1240/1240 77/1241/1241 304/1242/1242 f 77/1243/1243 324/1244/1244 352/1245/1245 f 77/1246/1246 352/1247/1247 304/1248/1248 f 301/1249/1249 347/1250/1250 80/1251/1251 f 301/1252/1252 80/1253/1253 93/1254/1254 f 79/1255/1255 346/1256/1256 300/1257/1257 f 79/1258/1258 300/1259/1259 92/1260/1260 f 345/1261/1261 216/1262/1262 80/1263/1263 f 345/1264/1264 80/1265/1265 347/1266/1266 f 79/1267/1267 215/1268/1268 344/1269/1269 f 79/1270/1270 344/1271/1271 346/1272/1272 f 343/1273/1273 327/1274/1274 82/1275/1275 f 343/1276/1276 82/1277/1277 210/1278/1278 f 81/1279/1279 326/1280/1280 342/1281/1281 f 81/1282/1282 342/1283/1283 209/1284/1284 f 345/1285/1285 343/1286/1286 210/1287/1287 f 345/1288/1288 210/1289/1289 216/1290/1290 f 209/1291/1291 342/1292/1292 344/1293/1293 f 209/1294/1294 344/1295/1295 215/1296/1296 f 333/1297/1297 84/1298/1298 82/1299/1299 f 333/1300/1300 82/1301/1301 327/1302/1302 f 81/1303/1303 83/1304/1304 332/1305/1305 f 81/1306/1306 332/1307/1307 326/1308/1308 f 339/1309/1309 333/1310/1310 327/1311/1311 f 339/1312/1312 327/1313/1313 329/1314/1314 f 326/1315/1315 332/1316/1316 338/1317/1317 f 326/1318/1318 338/1319/1319 328/1320/1320 f 341/1321/1321 335/1322/1322 331/1323/1323 f 341/1324/1324 331/1325/1325 337/1326/1326 f 330/1327/1327 334/1328/1328 340/1329/1329 f 330/1330/1330 340/1331/1331 336/1332/1332 f 339/1333/1333 337/1334/1334 331/1335/1335 f 339/1336/1336 331/1337/1337 333/1338/1338 f 330/1339/1339 336/1340/1340 338/1341/1341 f 330/1342/1342 338/1343/1343 332/1344/1344 f 331/1345/1345 86/1346/1346 84/1347/1347 f 331/1348/1348 84/1349/1349 333/1350/1350 f 83/1351/1351 85/1352/1352 330/1353/1353 f 83/1354/1354 330/1355/1355 332/1356/1356 f 335/1357/1357 88/1358/1358 86/1359/1359 f 335/1360/1360 86/1361/1361 331/1362/1362 f 85/1363/1363 87/1364/1364 334/1365/1365 f 85/1366/1366 334/1367/1367 330/1368/1368 f 341/1369/1369 90/1370/1370 88/1371/1371 f 341/1372/1372 88/1373/1373 335/1374/1374 f 87/1375/1375 89/1376/1376 340/1377/1377 f 87/1378/1378 340/1379/1379 334/1380/1380 f 306/1381/1381 91/1382/1382 90/1383/1383 f 306/1384/1384 90/1385/1385 341/1386/1386 f 89/1387/1387 91/1388/1388 306/1389/1389 f 89/1390/1390 306/1391/1391 340/1392/1392 f 337/1393/1393 307/1394/1394 306/1395/1395 f 337/1396/1396 306/1397/1397 341/1398/1398 f 306/1399/1399 307/1400/1400 336/1401/1401 f 306/1402/1402 336/1403/1403 340/1404/1404 f 339/1405/1405 308/1406/1406 307/1407/1407 f 339/1408/1408 307/1409/1409 337/1410/1410 f 307/1411/1411 308/1412/1412 338/1413/1413 f 307/1414/1414 338/1415/1415 336/1416/1416 f 329/1417/1417 309/1418/1418 308/1419/1419 f 329/1420/1420 308/1421/1421 339/1422/1422 f 308/1423/1423 309/1424/1424 328/1425/1425 f 308/1426/1426 328/1427/1427 338/1428/1428 f 301/1429/1429 93/1430/1430 95/1431/1431 f 301/1432/1432 95/1433/1433 299/1434/1434 f 94/1435/1435 92/1436/1436 300/1437/1437 f 94/1438/1438 300/1439/1439 298/1440/1440 f 299/1441/1441 95/1442/1442 97/1443/1443 f 299/1444/1444 97/1445/1445 297/1446/1446 f 96/1447/1447 94/1448/1448 298/1449/1449 f 96/1450/1450 298/1451/1451 296/1452/1452 f 297/1453/1453 97/1454/1454 99/1455/1455 f 297/1456/1456 99/1457/1457 295/1458/1458 f 98/1459/1459 96/1460/1460 296/1461/1461 f 98/1462/1462 296/1463/1463 294/1464/1464 f 295/1465/1465 99/1466/1466 101/1467/1467 f 295/1468/1468 101/1469/1469 293/1470/1470 f 100/1471/1471 98/1472/1472 294/1473/1473 f 100/1474/1474 294/1475/1475 292/1476/1476 f 293/1477/1477 101/1478/1478 103/1479/1479 f 293/1480/1480 103/1481/1481 291/1482/1482 f 102/1483/1483 100/1484/1484 292/1485/1485 f 102/1486/1486 292/1487/1487 290/1488/1488 f 291/1489/1489 103/1490/1490 105/1491/1491 f 291/1492/1492 105/1493/1493 289/1494/1494 f 104/1495/1495 102/1496/1496 290/1497/1497 f 104/1498/1498 290/1499/1499 288/1500/1500 f 289/1501/1501 105/1502/1502 107/1503/1503 f 289/1504/1504 107/1505/1505 287/1506/1506 f 106/1507/1507 104/1508/1508 288/1509/1509 f 106/1510/1510 288/1511/1511 286/1512/1512 f 287/1513/1513 107/1514/1514 109/1515/1515 f 287/1516/1516 109/1517/1517 285/1518/1518 f 108/1519/1519 106/1520/1520 286/1521/1521 f 108/1522/1522 286/1523/1523 284/1524/1524 f 285/1525/1525 109/1526/1526 67/1527/1527 f 285/1528/1528 67/1529/1529 73/1530/1530 f 67/1531/1531 108/1532/1532 284/1533/1533 f 67/1534/1534 284/1535/1535 73/1536/1536 f 281/1537/1537 235/1538/1538 233/1539/1539 f 281/1540/1540 233/1541/1541 283/1542/1542 f 232/1543/1543 234/1544/1544 280/1545/1545 f 232/1546/1546 280/1547/1547 282/1548/1548 f 283/1549/1549 233/1550/1550 255/1551/1551 f 283/1552/1552 255/1553/1553 261/1554/1554 f 254/1555/1555 232/1556/1556 282/1557/1557 f 254/1558/1558 282/1559/1559 260/1560/1560 f 261/1561/1561 255/1562/1562 257/1563/1563 f 261/1564/1564 257/1565/1565 259/1566/1566 f 256/1567/1567 254/1568/1568 260/1569/1569 f 256/1570/1570 260/1571/1571 258/1572/1572 f 263/1573/1573 253/1574/1574 235/1575/1575 f 263/1576/1576 235/1577/1577 281/1578/1578 f 234/1579/1579 252/1580/1580 262/1581/1581 f 234/1582/1582 262/1583/1583 280/1584/1584 f 265/1585/1585 251/1586/1586 253/1587/1587 f 265/1588/1588 253/1589/1589 263/1590/1590 f 252/1591/1591 250/1592/1592 264/1593/1593 f 252/1594/1594 264/1595/1595 262/1596/1596 f 267/1597/1597 249/1598/1598 251/1599/1599 f 267/1600/1600 251/1601/1601 265/1602/1602 f 250/1603/1603 248/1604/1604 266/1605/1605 f 250/1606/1606 266/1607/1607 264/1608/1608 f 269/1609/1609 247/1610/1610 249/1611/1611 f 269/1612/1612 249/1613/1613 267/1614/1614 f 248/1615/1615 246/1616/1616 268/1617/1617 f 248/1618/1618 268/1619/1619 266/1620/1620 f 271/1621/1621 245/1622/1622 247/1623/1623 f 271/1624/1624 247/1625/1625 269/1626/1626 f 246/1627/1627 244/1628/1628 270/1629/1629 f 246/1630/1630 270/1631/1631 268/1632/1632 f 273/1633/1633 243/1634/1634 245/1635/1635 f 273/1636/1636 245/1637/1637 271/1638/1638 f 244/1639/1639 242/1640/1640 272/1641/1641 f 244/1642/1642 272/1643/1643 270/1644/1644 f 275/1645/1645 241/1646/1646 243/1647/1647 f 275/1648/1648 243/1649/1649 273/1650/1650 f 242/1651/1651 240/1652/1652 274/1653/1653 f 242/1654/1654 274/1655/1655 272/1656/1656 f 279/1657/1657 237/1658/1658 241/1659/1659 f 279/1660/1660 241/1661/1661 275/1662/1662 f 240/1663/1663 236/1664/1664 278/1665/1665 f 240/1666/1666 278/1667/1667 274/1668/1668 f 277/1669/1669 239/1670/1670 237/1671/1671 f 277/1672/1672 237/1673/1673 279/1674/1674 f 236/1675/1675 238/1676/1676 276/1677/1677 f 236/1678/1678 276/1679/1679 278/1680/1680 f 259/1681/1681 257/1682/1682 239/1683/1683 f 259/1684/1684 239/1685/1685 277/1686/1686 f 238/1687/1687 256/1688/1688 258/1689/1689 f 238/1690/1690 258/1691/1691 276/1692/1692 f 257/1693/1693 111/1694/1694 129/1695/1695 f 257/1696/1696 129/1697/1697 239/1698/1698 f 128/1699/1699 110/1700/1700 256/1701/1701 f 128/1702/1702 256/1703/1703 238/1704/1704 f 239/1705/1705 129/1706/1706 180/1707/1707 f 239/1708/1708 180/1709/1709 237/1710/1710 f 179/1711/1711 128/1712/1712 238/1713/1713 f 179/1714/1714 238/1715/1715 236/1716/1716 f 237/1717/1717 180/1718/1718 127/1719/1719 f 237/1720/1720 127/1721/1721 241/1722/1722 f 126/1723/1723 179/1724/1724 236/1725/1725 f 126/1726/1726 236/1727/1727 240/1728/1728 f 241/1729/1729 127/1730/1730 125/1731/1731 f 241/1732/1732 125/1733/1733 243/1734/1734 f 124/1735/1735 126/1736/1736 240/1737/1737 f 124/1738/1738 240/1739/1739 242/1740/1740 f 243/1741/1741 125/1742/1742 123/1743/1743 f 243/1744/1744 123/1745/1745 245/1746/1746 f 122/1747/1747 124/1748/1748 242/1749/1749 f 122/1750/1750 242/1751/1751 244/1752/1752 f 245/1753/1753 123/1754/1754 121/1755/1755 f 245/1756/1756 121/1757/1757 247/1758/1758 f 120/1759/1759 122/1760/1760 244/1761/1761 f 120/1762/1762 244/1763/1763 246/1764/1764 f 247/1765/1765 121/1766/1766 119/1767/1767 f 247/1768/1768 119/1769/1769 249/1770/1770 f 118/1771/1771 120/1772/1772 246/1773/1773 f 118/1774/1774 246/1775/1775 248/1776/1776 f 249/1777/1777 119/1778/1778 117/1779/1779 f 249/1780/1780 117/1781/1781 251/1782/1782 f 116/1783/1783 118/1784/1784 248/1785/1785 f 116/1786/1786 248/1787/1787 250/1788/1788 f 251/1789/1789 117/1790/1790 115/1791/1791 f 251/1792/1792 115/1793/1793 253/1794/1794 f 114/1795/1795 116/1796/1796 250/1797/1797 f 114/1798/1798 250/1799/1799 252/1800/1800 f 253/1801/1801 115/1802/1802 182/1803/1803 f 253/1804/1804 182/1805/1805 235/1806/1806 f 181/1807/1807 114/1808/1808 252/1809/1809 f 181/1810/1810 252/1811/1811 234/1812/1812 f 255/1813/1813 113/1814/1814 111/1815/1815 f 255/1816/1816 111/1817/1817 257/1818/1818 f 110/1819/1819 112/1820/1820 254/1821/1821 f 110/1822/1822 254/1823/1823 256/1824/1824 f 233/1825/1825 184/1826/1826 113/1827/1827 f 233/1828/1828 113/1829/1829 255/1830/1830 f 112/1831/1831 183/1832/1832 232/1833/1833 f 112/1834/1834 232/1835/1835 254/1836/1836 f 235/1837/1837 182/1838/1838 184/1839/1839 f 235/1840/1840 184/1841/1841 233/1842/1842 f 183/1843/1843 181/1844/1844 234/1845/1845 f 183/1846/1846 234/1847/1847 232/1848/1848 f 230/1849/1849 231/1850/1850 224/1851/1851 f 230/1852/1852 224/1853/1853 226/1854/1854 f 224/1855/1855 231/1856/1856 229/1857/1857 f 224/1858/1858 229/1859/1859 225/1860/1860 f 224/1861/1861 72/1862/1862 223/1863/1863 f 224/1864/1864 223/1865/1865 226/1866/1866 f 222/1867/1867 72/1868/1868 224/1869/1869 f 222/1870/1870 224/1871/1871 225/1872/1872 f 226/1873/1873 223/1874/1874 221/1875/1875 f 226/1876/1876 221/1877/1877 228/1878/1878 f 220/1879/1879 222/1880/1880 225/1881/1881 f 220/1882/1882 225/1883/1883 227/1884/1884 f 228/1885/1885 221/1886/1886 219/1887/1887 f 228/1888/1888 219/1889/1889 230/1890/1890 f 218/1891/1891 220/1892/1892 227/1893/1893 f 218/1894/1894 227/1895/1895 229/1896/1896 f 230/1897/1897 219/1898/1898 217/1899/1899 f 230/1900/1900 217/1901/1901 231/1902/1902 f 217/1903/1903 218/1904/1904 229/1905/1905 f 217/1906/1906 229/1907/1907 231/1908/1908 f 219/1909/1909 136/1910/1910 137/1911/1911 f 219/1912/1912 137/1913/1913 217/1914/1914 f 137/1915/1915 135/1916/1916 218/1917/1917 f 137/1918/1918 218/1919/1919 217/1920/1920 f 221/1921/1921 134/1922/1922 136/1923/1923 f 221/1924/1924 136/1925/1925 219/1926/1926 f 135/1927/1927 133/1928/1928 220/1929/1929 f 135/1930/1930 220/1931/1931 218/1932/1932 f 223/1933/1933 132/1934/1934 134/1935/1935 f 223/1936/1936 134/1937/1937 221/1938/1938 f 133/1939/1939 131/1940/1940 222/1941/1941 f 133/1942/1942 222/1943/1943 220/1944/1944 f 72/1945/1945 130/1946/1946 132/1947/1947 f 72/1948/1948 132/1949/1949 223/1950/1950 f 131/1951/1951 130/1952/1952 72/1953/1953 f 131/1954/1954 72/1955/1955 222/1956/1956 f 212/1957/1957 165/1958/1958 80/1959/1959 f 212/1960/1960 80/1961/1961 216/1962/1962 f 79/1963/1963 164/1964/1964 211/1965/1965 f 79/1966/1966 211/1967/1967 215/1968/1968 f 212/1969/1969 216/1970/1970 210/1971/1971 f 212/1972/1972 210/1973/1973 214/1974/1974 f 209/1975/1975 215/1976/1976 211/1977/1977 f 209/1978/1978 211/1979/1979 213/1980/1980 f 214/1981/1981 210/1982/1982 82/1983/1983 f 214/1984/1984 82/1985/1985 167/1986/1986 f 81/1987/1987 209/1988/1988 213/1989/1989 f 81/1990/1990 213/1991/1991 166/1992/1992 f 167/1993/1993 188/1994/1994 145/1995/1995 f 167/1996/1996 145/1997/1997 214/1998/1998 f 144/1999/1999 187/2000/2000 166/2001/2001 f 144/2002/2002 166/2003/2003 213/2004/2004 f 214/2005/2005 145/2006/2006 143/2007/2007 f 214/2008/2008 143/2009/2009 212/2010/2010 f 142/2011/2011 144/2012/2012 213/2013/2013 f 142/2014/2014 213/2015/2015 211/2016/2016 f 212/2017/2017 143/2018/2018 141/2019/2019 f 212/2020/2020 141/2021/2021 165/2022/2022 f 140/2023/2023 142/2024/2024 211/2025/2025 f 140/2026/2026 211/2027/2027 164/2028/2028 f 165/2029/2029 141/2030/2030 139/2031/2031 f 165/2032/2032 139/2033/2033 177/2034/2034 f 139/2035/2035 140/2036/2036 164/2037/2037 f 139/2038/2038 164/2039/2039 177/2040/2040 f 207/2041/2041 208/2042/2042 199/2043/2043 f 207/2044/2044 199/2045/2045 205/2046/2046 f 199/2047/2047 208/2048/2048 206/2049/2049 f 199/2050/2050 206/2051/2051 204/2052/2052 f 203/2053/2053 205/2054/2054 199/2055/2055 f 203/2056/2056 199/2057/2057 201/2058/2058 f 199/2059/2059 204/2060/2060 202/2061/2061 f 199/2062/2062 202/2063/2063 200/2064/2064 f 207/2065/2065 205/2066/2066 194/2067/2067 f 207/2068/2068 194/2069/2069 192/2070/2070 f 193/2071/2071 204/2072/2072 206/2073/2073 f 193/2074/2074 206/2075/2075 191/2076/2076 f 205/2077/2077 203/2078/2078 196/2079/2079 f 205/2080/2080 196/2081/2081 194/2082/2082 f 195/2083/2083 202/2084/2084 204/2085/2085 f 195/2086/2086 204/2087/2087 193/2088/2088 f 203/2089/2089 201/2090/2090 198/2091/2091 f 203/2092/2092 198/2093/2093 196/2094/2094 f 197/2095/2095 200/2096/2096 202/2097/2097 f 197/2098/2098 202/2099/2099 195/2100/2100 f 201/2101/2101 199/2102/2102 71/2103/2103 f 201/2104/2104 71/2105/2105 198/2106/2106 f 71/2107/2107 199/2108/2108 200/2109/2109 f 71/2110/2110 200/2111/2111 197/2112/2112 f 207/2113/2113 192/2114/2114 70/2115/2115 f 207/2116/2116 70/2117/2117 208/2118/2118 f 70/2119/2119 191/2120/2120 206/2121/2121 f 70/2122/2122 206/2123/2123 208/2124/2124 f 192/2125/2125 145/2126/2126 190/2127/2127 f 192/2128/2128 190/2129/2129 70/2130/2130 f 190/2131/2131 144/2132/2132 191/2133/2133 f 190/2134/2134 191/2135/2135 70/2136/2136 f 198/2137/2137 71/2138/2138 138/2139/2139 f 198/2140/2140 138/2141/2141 139/2142/2142 f 138/2143/2143 71/2144/2144 197/2145/2145 f 138/2146/2146 197/2147/2147 139/2148/2148 f 196/2149/2149 198/2150/2150 139/2151/2151 f 196/2152/2152 139/2153/2153 141/2154/2154 f 139/2155/2155 197/2156/2156 195/2157/2157 f 139/2158/2158 195/2159/2159 140/2160/2160 f 194/2161/2161 196/2162/2162 141/2163/2163 f 194/2164/2164 141/2165/2165 143/2166/2166 f 140/2167/2167 195/2168/2168 193/2169/2169 f 140/2170/2170 193/2171/2171 142/2172/2172 f 192/2173/2173 194/2174/2174 143/2175/2175 f 192/2176/2176 143/2177/2177 145/2178/2178 f 142/2179/2179 193/2180/2180 191/2181/2181 f 142/2182/2182 191/2183/2183 144/2184/2184 f 186/2185/2185 132/2186/2186 130/2187/2187 f 186/2188/2188 130/2189/2189 69/2190/2190 f 130/2191/2191 131/2192/2192 185/2193/2193 f 130/2194/2194 185/2195/2195 69/2196/2196 f 189/2197/2197 188/2198/2198 186/2199/2199 f 189/2200/2200 186/2201/2201 69/2202/2202 f 185/2203/2203 187/2204/2204 189/2205/2205 f 185/2206/2206 189/2207/2207 69/2208/2208 f 189/2209/2209 190/2210/2210 145/2211/2211 f 189/2212/2212 145/2213/2213 188/2214/2214 f 144/2215/2215 190/2216/2216 189/2217/2217 f 144/2218/2218 189/2219/2219 187/2220/2220 f 169/2221/2221 171/2222/2222 132/2223/2223 f 169/2224/2224 132/2225/2225 186/2226/2226 f 131/2227/2227 170/2228/2228 168/2229/2229 f 131/2230/2230 168/2231/2231 185/2232/2232 f 186/2233/2233 188/2234/2234 167/2235/2235 f 186/2236/2236 167/2237/2237 169/2238/2238 f 166/2239/2239 187/2240/2240 185/2241/2241 f 166/2242/2242 185/2243/2243 168/2244/2244 f 173/2245/2245 134/2246/2246 132/2247/2247 f 173/2248/2248 132/2249/2249 171/2250/2250 f 131/2251/2251 133/2252/2252 172/2253/2253 f 131/2254/2254 172/2255/2255 170/2256/2256 f 175/2257/2257 136/2258/2258 134/2259/2259 f 175/2260/2260 134/2261/2261 173/2262/2262 f 133/2263/2263 135/2264/2264 174/2265/2265 f 133/2266/2266 174/2267/2267 172/2268/2268 f 176/2269/2269 137/2270/2270 136/2271/2271 f 176/2272/2272 136/2273/2273 175/2274/2274 f 135/2275/2275 137/2276/2276 176/2277/2277 f 135/2278/2278 176/2279/2279 174/2280/2280 f 184/2281/2281 182/2282/2282 177/2283/2283 f 184/2284/2284 177/2285/2285 178/2286/2286 f 177/2287/2287 181/2288/2288 183/2289/2289 f 177/2290/2290 183/2291/2291 178/2292/2292 f 178/2293/2293 68/2294/2294 113/2295/2295 f 178/2296/2296 113/2297/2297 184/2298/2298 f 112/2299/2299 68/2300/2300 178/2301/2301 f 112/2302/2302 178/2303/2303 183/2304/2304 f 68/2305/2305 163/2306/2306 111/2307/2307 f 68/2308/2308 111/2309/2309 113/2310/2310 f 110/2311/2311 162/2312/2312 68/2313/2313 f 110/2314/2314 68/2315/2315 112/2316/2316 f 177/2317/2317 182/2318/2318 115/2319/2319 f 177/2320/2320 115/2321/2321 165/2322/2322 f 114/2323/2323 181/2324/2324 177/2325/2325 f 114/2326/2326 177/2327/2327 164/2328/2328 f 147/2329/2329 165/2330/2330 115/2331/2331 f 147/2332/2332 115/2333/2333 117/2334/2334 f 114/2335/2335 164/2336/2336 146/2337/2337 f 114/2338/2338 146/2339/2339 116/2340/2340 f 149/2341/2341 147/2342/2342 117/2343/2343 f 149/2344/2344 117/2345/2345 119/2346/2346 f 116/2347/2347 146/2348/2348 148/2349/2349 f 116/2350/2350 148/2351/2351 118/2352/2352 f 151/2353/2353 149/2354/2354 119/2355/2355 f 151/2356/2356 119/2357/2357 121/2358/2358 f 118/2359/2359 148/2360/2360 150/2361/2361 f 118/2362/2362 150/2363/2363 120/2364/2364 f 153/2365/2365 151/2366/2366 121/2367/2367 f 153/2368/2368 121/2369/2369 123/2370/2370 f 120/2371/2371 150/2372/2372 152/2373/2373 f 120/2374/2374 152/2375/2375 122/2376/2376 f 155/2377/2377 153/2378/2378 123/2379/2379 f 155/2380/2380 123/2381/2381 125/2382/2382 f 122/2383/2383 152/2384/2384 154/2385/2385 f 122/2386/2386 154/2387/2387 124/2388/2388 f 157/2389/2389 155/2390/2390 125/2391/2391 f 157/2392/2392 125/2393/2393 127/2394/2394 f 124/2395/2395 154/2396/2396 156/2397/2397 f 124/2398/2398 156/2399/2399 126/2400/2400 f 159/2401/2401 157/2402/2402 127/2403/2403 f 159/2404/2404 127/2405/2405 180/2406/2406 f 126/2407/2407 156/2408/2408 158/2409/2409 f 126/2410/2410 158/2411/2411 179/2412/2412 f 159/2413/2413 180/2414/2414 129/2415/2415 f 159/2416/2416 129/2417/2417 161/2418/2418 f 128/2419/2419 179/2420/2420 158/2421/2421 f 128/2422/2422 158/2423/2423 160/2424/2424 f 161/2425/2425 129/2426/2426 111/2427/2427 f 161/2428/2428 111/2429/2429 163/2430/2430 f 110/2431/2431 128/2432/2432 160/2433/2433 f 110/2434/2434 160/2435/2435 162/2436/2436 f 68/2437/2437 67/2438/2438 109/2439/2439 f 68/2440/2440 109/2441/2441 163/2442/2442 f 108/2443/2443 67/2444/2444 68/2445/2445 f 108/2446/2446 68/2447/2447 162/2448/2448 f 163/2449/2449 109/2450/2450 107/2451/2451 f 163/2452/2452 107/2453/2453 161/2454/2454 f 106/2455/2455 108/2456/2456 162/2457/2457 f 106/2458/2458 162/2459/2459 160/2460/2460 f 161/2461/2461 107/2462/2462 105/2463/2463 f 161/2464/2464 105/2465/2465 159/2466/2466 f 104/2467/2467 106/2468/2468 160/2469/2469 f 104/2470/2470 160/2471/2471 158/2472/2472 f 159/2473/2473 105/2474/2474 103/2475/2475 f 159/2476/2476 103/2477/2477 157/2478/2478 f 102/2479/2479 104/2480/2480 158/2481/2481 f 102/2482/2482 158/2483/2483 156/2484/2484 f 157/2485/2485 103/2486/2486 101/2487/2487 f 157/2488/2488 101/2489/2489 155/2490/2490 f 100/2491/2491 102/2492/2492 156/2493/2493 f 100/2494/2494 156/2495/2495 154/2496/2496 f 155/2497/2497 101/2498/2498 99/2499/2499 f 155/2500/2500 99/2501/2501 153/2502/2502 f 98/2503/2503 100/2504/2504 154/2505/2505 f 98/2506/2506 154/2507/2507 152/2508/2508 f 153/2509/2509 99/2510/2510 97/2511/2511 f 153/2512/2512 97/2513/2513 151/2514/2514 f 96/2515/2515 98/2516/2516 152/2517/2517 f 96/2518/2518 152/2519/2519 150/2520/2520 f 151/2521/2521 97/2522/2522 95/2523/2523 f 151/2524/2524 95/2525/2525 149/2526/2526 f 94/2527/2527 96/2528/2528 150/2529/2529 f 94/2530/2530 150/2531/2531 148/2532/2532 f 149/2533/2533 95/2534/2534 93/2535/2535 f 149/2536/2536 93/2537/2537 147/2538/2538 f 92/2539/2539 94/2540/2540 148/2541/2541 f 92/2542/2542 148/2543/2543 146/2544/2544 f 147/2545/2545 93/2546/2546 80/2547/2547 f 147/2548/2548 80/2549/2549 165/2550/2550 f 79/2551/2551 92/2552/2552 146/2553/2553 f 79/2554/2554 146/2555/2555 164/2556/2556 f 169/2557/2557 167/2558/2558 82/2559/2559 f 169/2560/2560 82/2561/2561 84/2562/2562 f 81/2563/2563 166/2564/2564 168/2565/2565 f 81/2566/2566 168/2567/2567 83/2568/2568 f 171/2569/2569 169/2570/2570 84/2571/2571 f 171/2572/2572 84/2573/2573 86/2574/2574 f 83/2575/2575 168/2576/2576 170/2577/2577 f 83/2578/2578 170/2579/2579 85/2580/2580 f 173/2581/2581 171/2582/2582 86/2583/2583 f 173/2584/2584 86/2585/2585 88/2586/2586 f 85/2587/2587 170/2588/2588 172/2589/2589 f 85/2590/2590 172/2591/2591 87/2592/2592 f 175/2593/2593 173/2594/2594 88/2595/2595 f 175/2596/2596 88/2597/2597 90/2598/2598 f 87/2599/2599 172/2600/2600 174/2601/2601 f 87/2602/2602 174/2603/2603 89/2604/2604 f 176/2605/2605 175/2606/2606 90/2607/2607 f 176/2608/2608 90/2609/2609 91/2610/2610 f 89/2611/2611 174/2612/2612 176/2613/2613 f 89/2614/2614 176/2615/2615 91/2616/2616 f 50/2617/2617 48/2618/2618 2/2619/2619 f 50/2620/2620 2/2621/2621 66/2622/2622 f 1/2623/2623 47/2624/2624 49/2625/2625 f 1/2626/2626 49/2627/2627 65/2628/2628 f 66/2629/2629 2/2630/2630 12/2631/2631 f 66/2632/2632 12/2633/2633 64/2634/2634 f 11/2635/2635 1/2636/2636 65/2637/2637 f 11/2638/2638 65/2639/2639 63/2640/2640 f 64/2641/2641 12/2642/2642 14/2643/2643 f 64/2644/2644 14/2645/2645 60/2646/2646 f 13/2647/2647 11/2648/2648 63/2649/2649 f 13/2650/2650 63/2651/2651 59/2652/2652 f 60/2653/2653 14/2654/2654 24/2655/2655 f 60/2656/2656 24/2657/2657 58/2658/2658 f 23/2659/2659 13/2660/2660 59/2661/2661 f 23/2662/2662 59/2663/2663 57/2664/2664 f 58/2665/2665 24/2666/2666 26/2667/2667 f 58/2668/2668 26/2669/2669 56/2670/2670 f 25/2671/2671 23/2672/2672 57/2673/2673 f 25/2674/2674 57/2675/2675 55/2676/2676 f 56/2677/2677 26/2678/2678 36/2679/2679 f 56/2680/2680 36/2681/2681 54/2682/2682 f 35/2683/2683 25/2684/2684 55/2685/2685 f 35/2686/2686 55/2687/2687 53/2688/2688 f 54/2689/2689 36/2690/2690 38/2691/2691 f 54/2692/2692 38/2693/2693 52/2694/2694 f 37/2695/2695 35/2696/2696 53/2697/2697 f 37/2698/2698 53/2699/2699 51/2700/2700 f 52/2701/2701 38/2702/2702 48/2703/2703 f 52/2704/2704 48/2705/2705 50/2706/2706 f 47/2707/2707 37/2708/2708 51/2709/2709 f 47/2710/2710 51/2711/2711 49/2712/2712 f 46/2713/2713 48/2714/2714 38/2715/2715 f 46/2716/2716 38/2717/2717 40/2718/2718 f 37/2719/2719 47/2720/2720 45/2721/2721 f 37/2722/2722 45/2723/2723 39/2724/2724 f 44/2725/2725 46/2726/2726 40/2727/2727 f 44/2728/2728 40/2729/2729 42/2730/2730 f 39/2731/2731 45/2732/2732 43/2733/2733 f 39/2734/2734 43/2735/2735 41/2736/2736 f 42/2737/2737 40/2738/2738 34/2739/2739 f 42/2740/2740 34/2741/2741 32/2742/2742 f 33/2743/2743 39/2744/2744 41/2745/2745 f 33/2746/2746 41/2747/2747 31/2748/2748 f 40/2749/2749 38/2750/2750 36/2751/2751 f 40/2752/2752 36/2753/2753 34/2754/2754 f 35/2755/2755 37/2756/2756 39/2757/2757 f 35/2758/2758 39/2759/2759 33/2760/2760 f 34/2761/2761 36/2762/2762 26/2763/2763 f 34/2764/2764 26/2765/2765 28/2766/2766 f 25/2767/2767 35/2768/2768 33/2769/2769 f 25/2770/2770 33/2771/2771 27/2772/2772 f 32/2773/2773 34/2774/2774 28/2775/2775 f 32/2776/2776 28/2777/2777 30/2778/2778 f 27/2779/2779 33/2780/2780 31/2781/2781 f 27/2782/2782 31/2783/2783 29/2784/2784 f 30/2785/2785 28/2786/2786 22/2787/2787 f 30/2788/2788 22/2789/2789 20/2790/2790 f 21/2791/2791 27/2792/2792 29/2793/2793 f 21/2794/2794 29/2795/2795 19/2796/2796 f 28/2797/2797 26/2798/2798 24/2799/2799 f 28/2800/2800 24/2801/2801 22/2802/2802 f 23/2803/2803 25/2804/2804 27/2805/2805 f 23/2806/2806 27/2807/2807 21/2808/2808 f 22/2809/2809 24/2810/2810 14/2811/2811 f 22/2812/2812 14/2813/2813 16/2814/2814 f 13/2815/2815 23/2816/2816 21/2817/2817 f 13/2818/2818 21/2819/2819 15/2820/2820 f 20/2821/2821 22/2822/2822 16/2823/2823 f 20/2824/2824 16/2825/2825 18/2826/2826 f 15/2827/2827 21/2828/2828 19/2829/2829 f 15/2830/2830 19/2831/2831 17/2832/2832 f 18/2833/2833 16/2834/2834 10/2835/2835 f 18/2836/2836 10/2837/2837 8/2838/2838 f 9/2839/2839 15/2840/2840 17/2841/2841 f 9/2842/2842 17/2843/2843 7/2844/2844 f 16/2845/2845 14/2846/2846 12/2847/2847 f 16/2848/2848 12/2849/2849 10/2850/2850 f 11/2851/2851 13/2852/2852 15/2853/2853 f 11/2854/2854 15/2855/2855 9/2856/2856 f 10/2857/2857 12/2858/2858 2/2859/2859 f 10/2860/2860 2/2861/2861 4/2862/2862 f 1/2863/2863 11/2864/2864 9/2865/2865 f 1/2866/2866 9/2867/2867 3/2868/2868 f 8/2869/2869 10/2870/2870 4/2871/2871 f 8/2872/2872 4/2873/2873 6/2874/2874 f 3/2875/2875 9/2876/2876 7/2877/2877 f 3/2878/2878 7/2879/2879 5/2880/2880 f 6/2881/2881 4/2882/2882 46/2883/2883 f 6/2884/2884 46/2885/2885 44/2886/2886 f 45/2887/2887 3/2888/2888 5/2889/2889 f 45/2890/2890 5/2891/2891 43/2892/2892 f 4/2893/2893 2/2894/2894 48/2895/2895 f 4/2896/2896 48/2897/2897 46/2898/2898 f 47/2899/2899 1/2900/2900 3/2901/2901 f 47/2902/2902 3/2903/2903 45/2904/2904 globs-0.2.0~svn50/src/benchmarks/GL_shadow/object.c0000664000175000017500000001662511516033423021402 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique * Copyright (C) 2005 Angelo "Encelo" Theodorou * * object.c: simple and DIRTY Wavefront OBJ loader */ #include #include #include #include #include "object.h" /* Loads a 3D object in OBJ format */ Object *LoadObject(char *objfile) { FILE *fd; Object *obj; char buf[128]; char namebuf[128]; int nv, nt, nn, nf; char texbuf[128]; char matfile[128]; char material[128], mat[128]; Point *vertices, *texcoords, *normals; int fv[3], ft[3], fn[3]; int i; int mat_flag = 0; /* ----- Processing the .obj file ----- */ fd = fopen(objfile, "r"); if (fd == NULL) { printf("Unable to open %s\n", objfile); return NULL; } obj = (Object *)malloc(sizeof(Object)); nv = nt = nn = nf = 0; /* Element count */ while(fgets(buf, 128, fd) != NULL) { switch(buf[0]) { case 'm': if (strncmp(buf, "mtllib", 6) == 0) { sscanf(buf, "mtllib %s\n", matfile); } case 'o': sscanf(buf, "o %s\n", namebuf); break; case 'v': switch(buf[1]) { case ' ': nv++; break; /* Number of texcoords and normal vectors is equal to 3 times the number of faces */ /* This is true only for Blender 2.37a OBJ importer script, not for 2.40 one */ } break; case 'u': if (strncmp(buf, "usemat", 6) == 0) { sscanf(buf, "usemat %s\n", texbuf); } if (strncmp(buf, "usemtl", 6) == 0) { sscanf(buf, "usemtl %s\n", material); } break; case 'f': nf++; break; } } /* ----- Object initialization ----- */ /* Name */ obj->Name = malloc(sizeof(char) * strlen(namebuf)); strncpy(obj->Name, namebuf, strlen(namebuf)); (obj->Name)[strlen(namebuf)] = '\0'; /* Terminating the string, '\n' becomes '\0' */ /* Texture */ obj->TexId = LoadTexture(texbuf); /* nFaces */ obj->nFaces = nf; /* Faces */ obj->Faces = malloc(sizeof(Face) * nf); /* nVertices */ obj->nVertices = nv; /* Vertices */ obj->Vertices = (Point *)malloc(sizeof(Point) * nv); /* TexCoords */ obj->TexCoords = (Point *)malloc(sizeof(Point) * 3 * nf); /* Normals */ obj->Normals = (Point *)malloc(sizeof(Point) * 3 * nf); rewind(fd); nv = nt = nn = nf = 0; while(fgets(buf, 128, fd) != NULL) { switch(buf[0]) { case 'v': switch(buf[1]) { case ' ': sscanf(buf, "v %f %f %f\n", &obj->Vertices[nv].x, &obj->Vertices[nv].y, &obj->Vertices[nv].z); nv++; break; case 't': sscanf(buf, "vt %f %f %f\n", &obj->TexCoords[nt].x, &obj->TexCoords[nt].y, &obj->TexCoords[nt].z); nt++; break; case 'n': sscanf(buf, "vn %f %f %f\n", &obj->Normals[nn].x, &obj->Normals[nn].y, &obj->Normals[nn].z); nn++; break; } break; case 'f': sscanf(buf, "f %u/%u/%u %u/%u/%u %u/%u/%u \n", &fv[0], &ft[0], &fn[0], &fv[1], &ft[1], &fn[1], &fv[2], &ft[2], &fn[2]); for(i = 0; i < 3; i++) { fv[i]--; ft[i]--; fn[i]--; /* Face indices starts from 1 in Obj format */ obj->Faces[nf].VertIdx[i] = fv[i]; obj->Faces[nf].TexIdx[i] = ft[i]; obj->Faces[nf].NorIdx[i] = fn[i]; obj->Faces[nf].NeighIdx[i] = -1; /* Connectivity will be calculated later */ } nf++; break; } } fclose(fd); /* ----- Processing the .mtl file ----- */ fd = fopen(matfile, "r"); if (fd == NULL) { printf("Unable to open %s\n", matfile); return NULL; } while(fgets(buf, 128, fd) != NULL) { /* Search the correct material */ if (strncmp(buf, "newmtl", 6) == 0) { sscanf(buf, "newmtl %s", mat); if (strncmp(mat, material, strlen(material)) == 0) { mat_flag = 1; continue; } else { mat_flag = 0; continue; } } if (mat_flag == 1) switch(buf[0]){ case 'K': switch(buf[1]){ case 'd': sscanf(buf, "Kd %f %f %f\n", &obj->Diffuse[0], &obj->Diffuse[1], &obj->Diffuse[2]); break; case 'a': sscanf(buf, "Ka %f %f %f\n", &obj->Ambient[0], &obj->Ambient[1], &obj->Ambient[2]); break; case 's': sscanf(buf, "Ks %f %f %f\n", &obj->Specular[0], &obj->Specular[1], &obj->Specular[2]); break; } break; case 'd': sscanf(buf, "d %f\n", &obj->Diffuse[3]); obj->Ambient[3] = obj->Specular[3] = obj->Diffuse[3]; break; } } return obj; } /* Simple code to load a texture and return its id */ GLuint LoadTexture(char *tex_name) { GLuint tex_num; SDL_Surface *tex_img; glGenTextures(1, &tex_num); if(tex_img = (SDL_Surface *) IMG_Load(tex_name)) { glBindTexture(GL_TEXTURE_2D, tex_num); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); if ((tex_img->format)->Amask) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_img->w, tex_img->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_img->pixels); else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_img->w, tex_img->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_img->pixels); SDL_FreeSurface (tex_img); } else printf("Texture not found!\n"); return tex_num; } /* Edge connectivity */ void SetConnectivity(Object *obj) { int nf1, nf2; int e1, e2; int v1a, v1b, v2a, v2b; Face *face1, *face2; for(nf1=0; nf1 < obj->nFaces; nf1++){ /* For each face in the object */ face1 = &obj->Faces[nf1]; for(e1=0; e1<3; e1++){ /* For each edge of the face */ if(face1->NeighIdx[e1] == -1){ /* If connectivity is not yet set for this edge */ for(nf2=0; nf2 < obj->nFaces; nf2++){ /* Checking connectivity against any other face */ face2 = &obj->Faces[nf2]; if (nf2 == nf1) /* Skipping checking connectivity against the same face we are checking on */ continue; for(e2=0; e2<3; e2++){ v1a = face1->VertIdx[e1]; v1b = face1->VertIdx[(e1+1)%3]; v2a = face2->VertIdx[e2]; v2b = face2->VertIdx[(e2+1)%3]; if((v1a == v1b && v2a == v2b) || (v1a == v2b && v2a == v1b)){ face1->NeighIdx[e1] = nf2; face2->NeighIdx[e2] = nf1; break; } } } } } } } /* Calculates the equation of the plane on which a face is laying on */ void CalculatePlane(Object *obj, int nf) { Point v1, v2, v3; Face *face; face = &obj->Faces[nf]; v1 = obj->Vertices[face->VertIdx[0]]; v2 = obj->Vertices[face->VertIdx[1]]; v3 = obj->Vertices[face->VertIdx[2]]; face->pEq.a = v1.y*(v2.z-v3.z) + v2.y*(v3.z-v1.z) + v3.y*(v1.z-v2.z); face->pEq.b = v1.z*(v2.x-v3.x) + v2.z*(v3.x-v1.x) + v3.z*(v1.x-v2.x); face->pEq.c = v1.x*(v2.y-v3.y) + v2.x*(v3.y-v1.y) + v3.x*(v1.y-v2.y); face->pEq.d = -(v1.x*(v2.y*v3.z-v3.y*v2.z) + v2.x*(v3.y*v1.z-v1.y*v3.z) + v3.x*(v1.y*v2.z-v2.y*v1.z)); } Object *InitObject(char *objfile) { int nf; Object *obj; if((obj = LoadObject(objfile)) != NULL){ SetConnectivity(obj); for(nf=0; nf < obj->nFaces; nf++) CalculatePlane(obj, nf); } return obj; } void FreeObject(Object *obj) { glDeleteTextures(1, &(obj->TexId)); free(obj->Normals); free(obj->TexCoords); free(obj->Vertices); free(obj->Faces); free(obj->Name); } void DrawObject(Object *obj) { int nf, i; Face *face; Point *n, *t, *v; glBindTexture(GL_TEXTURE_2D, obj->TexId); glBegin(GL_TRIANGLES); for(nf=0; nf < obj->nFaces; nf++) { face = &obj->Faces[nf]; for(i=0; i<3; i++) { n = &obj->Normals[face->NorIdx[i]]; t = &obj->TexCoords[face->TexIdx[i]]; v = &obj->Vertices[face->VertIdx[i]]; glNormal3f(n->x, n->y, n->z); glTexCoord3f(t->x, t->y, t->z); glVertex3f(v->x, v->y, v->z); } } glEnd(); } globs-0.2.0~svn50/src/benchmarks/GL_shadow/object.h0000664000175000017500000000257711516033423021410 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique * Copyright (C) 2005 Angelo "Encelo" Theodorou */ #ifndef _OBJECT_H_ #define _OBJECT_H_ #include #include typedef struct Point { GLfloat x, y, z; /* Point coordinates */ } Point; typedef struct Plane { GLfloat a, b, c, d; /* ax + by + cz + d = 0 */ } Plane; /* Triangular face */ typedef struct Face { int VertIdx[3]; /* Vertex indices */ int TexIdx[3]; /* Texture coordinates indices */ int NorIdx[3]; /* Normal vectors indices */ Plane pEq; /* Equation of the plane on which the triangle is laying */ int NeighIdx[3]; /* Indices of the faces neighbouring this one */ int Visible; /* Is this face visible by the light? */ } Face; typedef struct Object { char *Name; GLuint TexId; GLfloat Diffuse[4]; GLfloat Ambient[4]; GLfloat Specular[4]; int nFaces; Face *Faces; /* Array of faces */ int nVertices; Point *Vertices; /* Array of vertex coordinates */ Point *TexCoords; /* Array of texture coordinates */ Point *Normals; /* Array of normal vectors */ } Object; Object *LoadObject(char *filename); GLuint LoadTexture(char *texname); void SetConnectivity(Object *obj); void CalculatePlane(Object *obj, int nf); Object *InitObject(char *objfile); void FreeObject(Object *obj); void DrawObject(Object *obj); #endif globs-0.2.0~svn50/src/benchmarks/GL_shadow/cube.mtl0000664000175000017500000000025511516033423021414 0ustar takakitakaki# Blender MTL File: untitled.blend # Material Count: 1 newmtl Material_tex.png Ns 96.0 Ka 0.0 0.0 0.0 Kd 0.64 0.64 0.64 Ks 0.5 0.5 0.5 Ni 1.0 d 1.0 illum 2 map_Kd tex.png globs-0.2.0~svn50/src/benchmarks/GL_shadow/SConscript0000664000175000017500000000064711516033423021777 0ustar takakitakaki# import variables Import('env', 'install_dir') common_src = ['../get_options.c', '../check_time.c'] prog = env.Program('gl_shadow', ['main.c', 'object.c', 'shadow.c', 'extra.c'] + common_src) # Install if install_dir != '': dest = install_dir + '/GL_shadow' data = ['cube.obj', 'cube.mtl', 'tex.png'] env.Install(dest, 'globs_info.json') env.Install(dest, prog) env.Install(dest, data) env.Alias('install', dest) globs-0.2.0~svn50/src/benchmarks/GL_shadow/extra.h0000664000175000017500000000121311516033423021247 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique * Copyright (C) 2005 Angelo "Encelo" Theodorou */ #ifndef _EXTRA_H_ #define _EXTRA_H_ #ifndef M_PIl #define M_PIl 3.1415926535897932384626433832795029L #endif typedef struct Light { GLfloat Position[4]; GLfloat Ambient[4]; GLfloat Diffuse[4]; GLfloat Specular[4]; } Light; int FrameTiming(void); void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar); void DrawRoom(void); void UpdateLight(Light *light, GLint gl_light, GLfloat size); void VMatMult(GLfloat M[16], GLfloat v[4]); void CpVec(GLfloat *src, GLfloat *dst, int size); #endif globs-0.2.0~svn50/src/benchmarks/GL_shadow/cube.obj0000664000175000017500000000547511516033423021403 0ustar takakitakaki# Blender OBJ File: /home/encelo/NEW/soft_test.blend # www.blender.org mtllib cube.mtl o Cube v 1.0 1.0 -1.0 v 1.0 -1.0 -1.0 v -1.0 -1.0 -1.0 v -1.0 1.0 -1.0 v 1.0 1.0 1.0 v -1.0 1.0 1.0 v -1.0 -1.0 1.0 v 1.0 -1.0 1.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 1.0 0.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 1.0 0.0 vt 1.0 1.0 0.0 vt 0.0 0.0 0.0 vt 1.0 1.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 1.0 0.0 vt 1.0 1.0 0.0 vt 0.0 0.0 0.0 vt 1.0 1.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 1.0 0.0 vt 1.0 1.0 0.0 vt 0.0 0.0 0.0 vt 1.0 1.0 0.0 vt 1.0 0.0 0.0 vt 0.0 1.0 0.0 vt 1.0 1.0 0.0 vt 1.0 0.0 0.0 vt 0.0 1.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 0.0 0.0 0.0 vt 1.0 0.0 0.0 vt 0.0 0.0 0.0 vt 1.0 0.0 0.0 vt 1.0 0.0 0.0 vn 0.577350258827 0.577350258827 0.577350258827 vn 0.577350258827 0.577350258827 -0.577350258827 vn -0.577350258827 0.577350258827 -0.577350258827 vn 0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 0.577350258827 -0.577350258827 vn -0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 -0.577350258827 vn -0.577350258827 -0.577350258827 0.577350258827 vn -0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 -0.577350258827 vn -0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 0.577350258827 -0.577350258827 vn 0.577350258827 -0.577350258827 -0.577350258827 vn 0.577350258827 -0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 -0.577350258827 -0.577350258827 vn -0.577350258827 -0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 -0.577350258827 vn 0.577350258827 0.577350258827 -0.577350258827 vn 0.577350258827 0.577350258827 0.577350258827 vn 0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 0.577350258827 -0.577350258827 vn 0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 -0.577350258827 -0.577350258827 vn 0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 0.577350258827 0.577350258827 vn -0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 -0.577350258827 0.577350258827 vn 0.577350258827 0.577350258827 -0.577350258827 vn 0.577350258827 -0.577350258827 -0.577350258827 vn -0.577350258827 -0.577350258827 -0.577350258827 vn 0.577350258827 0.577350258827 -0.577350258827 vn -0.577350258827 -0.577350258827 -0.577350258827 vn -0.577350258827 0.577350258827 -0.577350258827 usemtl Material usemat tex.png f 5/1/1 1/2/2 4/3/3 f 5/4/4 4/5/5 6/6/6 f 3/7/7 7/8/8 6/9/9 f 3/10/10 6/11/11 4/12/12 f 2/13/13 8/14/14 7/15/15 f 2/16/16 7/17/17 3/18/18 f 1/19/19 5/20/20 8/21/21 f 1/22/22 8/23/23 2/24/24 f 5/25/25 6/26/26 7/27/27 f 5/28/28 7/29/29 8/30/30 f 1/31/31 2/32/32 3/33/33 f 1/34/34 3/35/35 4/36/36 globs-0.2.0~svn50/src/benchmarks/GL_shadow/shadow.h0000664000175000017500000000054211516033423021415 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique * Copyright (C) 2005 Angelo "Encelo" Theodorou */ #include "extra.h" #define INF 10 /* What to consider "infinity" for silhouette edge projection */ void CastShadow(Object *obj, GLfloat lightpos[4]); void DrawShadow(void); void ShadowVolume(Object *obj, GLfloat lightpos[4]); globs-0.2.0~svn50/src/benchmarks/GL_shadow/suzanne.mtl0000664000175000017500000000013511516033423022156 0ustar takakitakakinewmtl Material Ns 96.0784313725 Kd 0.8 0.8 0.8 Ka 1.0 1.0 1.0 Ks 1.0 1.0 1.0 d 1.0 illum 2 globs-0.2.0~svn50/src/benchmarks/GL_shadow/test_obj.c0000664000175000017500000000276011516033423021740 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volumes technique * Copyright (C) 2005 Angelo "Encelo" Theodorou * * test_obj.c: OBJ loader test program */ #include "object.h" int main(int argc, char **argv) { Object *obj; int nf, i; Face *face; Point *n, *t, *v; if (argc != 2){ printf("One argument is needed!\n"); return -1; } if((obj = InitObject(argv[1])) == NULL){ printf("Error loading the object!\n"); return -1; } printf("Name: %s\n", obj->Name); printf("TexId: %u\n", obj->TexId); printf("Diffuse Color: <%f, %f, %f, %f>\n", obj->Diffuse[0], obj->Diffuse[1], obj->Diffuse[2], obj->Diffuse[3]); printf("Ambient Color: <%f, %f, %f, %f>\n", obj->Ambient[0], obj->Ambient[1], obj->Ambient[2], obj->Ambient[3]); printf("Specular Color: <%f, %f, %f, %f>\n", obj->Specular[0], obj->Specular[1], obj->Specular[2], obj->Specular[3]); printf("%d faces\n\n", obj->nFaces); for(nf=0; nf < obj->nFaces; nf++){ face = &obj->Faces[nf]; printf("Face number %d\n", nf); printf("Plane equation: %f*x + %f*y + %f*z + %f\n", face->pEq.a, face->pEq.b, face->pEq.c, face->pEq.d); for(i=0; i<3; i++){ n = &obj->Normals[face->NorIdx[i]]; t = &obj->TexCoords[face->TexIdx[i]]; v = &obj->Vertices[face->VertIdx[i]]; printf("V: <%f, %f, %f>\n", v->x, v->y, v->z); printf("N: <%f, %f, %f>\n", n->x, n->y, n->z); printf("T: <%f, %f, %f>\n", t->x, t->y, t->z); printf("Neighbour Index: %d\n", face->NeighIdx[i]); } printf("\n"); } FreeObject(obj); return 0; } globs-0.2.0~svn50/src/benchmarks/GL_shadow/extra.c0000664000175000017500000000724511516033423021255 0ustar takakitakaki/* GL_shadow: an implementation of the stencil shadow volume technique * Copyright (C) 2005 Angelo "Encelo" Theodorou * * extra.c: general and light relative functions */ #include #include #include #include "extra.h" #include "object.h" /* Calculate frame interval and print FPS each 5s */ int FrameTiming(void) { Uint32 interval; static Uint32 current, last = 0, five = 0, nframes = 0; current = SDL_GetTicks(); nframes++; /* if (current - five > 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } */ interval = current - last; last = current; return interval; } /* Replaces gluPerspective. Sets the frustum to perspective mode. * fovY - Field of vision in degrees in the y direction * aspect - Aspect ratio of the viewport * zNear - The near clipping distance * zFar - The far clipping distance */ void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar) { GLdouble fW, fH; fH = tan( (fovY / 2) / 180 * M_PIl ) * zNear; fW = fH * aspect; glFrustum( -fW, fW, -fH, fH, zNear, zFar ); } /* Draws the walls on which objects' shadow will be projected */ void DrawRoom(void) { glPushAttrib(GL_TEXTURE_BIT); glDisable(GL_TEXTURE_2D); glColor3f(0.6f, 0.6f, 0.6f); glBegin(GL_QUADS); /* Floor */ glNormal3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f,-1.0f,-2.0f); glVertex3f(-1.0f,-1.0f, 2.0f); glVertex3f( 1.0f,-1.0f, 2.0f); glVertex3f( 1.0f,-1.0f,-2.0f); /* Ceiling */ glNormal3f(0.0f,-1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 2.0f); glVertex3f(-1.0f, 1.0f,-2.0f); glVertex3f( 1.0f, 1.0f,-2.0f); glVertex3f( 1.0f, 1.0f, 2.0f); /* Back Wall */ glNormal3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -2.0f); glVertex3f(-1.0f,-1.0f, -2.0f); glVertex3f( 1.0f,-1.0f, -2.0f); glVertex3f( 1.0f, 1.0f, -2.0f); /* Left Wall */ glNormal3f( 1.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 2.0f); glVertex3f(-1.0f,-1.0f, 2.0f); glVertex3f(-1.0f,-1.0f,-2.0f); glVertex3f(-1.0f, 1.0f,-2.0f); /* Right Wall */ glNormal3f(-1.0f, 0.0f, 0.0f); glVertex3f( 1.0f, 1.0f,-2.0f); glVertex3f( 1.0f,-1.0f,-2.0f); glVertex3f( 1.0f,-1.0f, 2.0f); glVertex3f( 1.0f, 1.0f, 2.0f); glEnd(); glPopAttrib(); } /* Updates light position in the OpenGL state machine and then draws the light */ void UpdateLight(Light *light, GLint gl_light, GLfloat size) { GLfloat x, y, z; x = light->Position[0]; y = light->Position[1]; z = light->Position[2]; glLightfv(gl_light, GL_POSITION, light->Position); glLightfv(gl_light, GL_AMBIENT, light->Ambient); glLightfv(gl_light, GL_DIFFUSE, light->Diffuse); glLightfv(gl_light, GL_SPECULAR, light->Specular); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glColor3f(light->Diffuse[0], light->Diffuse[1], light->Diffuse[2]); glBegin(GL_QUADS); glVertex3f(x+(0.5f*size), y+(0.5f*size), z); glVertex3f(x-(0.5f*size), y+(0.5f*size), z); glVertex3f(x-(0.5f*size), y-(0.5f*size), z); glVertex3f(x+(0.5f*size), y-(0.5f*size), z); glEnd(); glPopAttrib(); } /* Vector per matrix multiplication */ void VMatMult(GLfloat M[16], GLfloat v[4]) { GLfloat res[4]; res[0] = M[0] * v[0] + M[4] * v[1] + M[8] *v[2] +M[12] * v[3]; res[1] = M[1] * v[0] + M[5] * v[1] + M[9] *v[2] +M[13] * v[3]; res[2] = M[2] * v[0] + M[6] * v[1] + M[10] *v[2] +M[14] * v[3]; res[3] = M[3] * v[0] + M[7] * v[1] + M[11] *v[2] +M[15] * v[3]; /* Results Are Stored Back In v[] */ v[0] = res[0]; v[1] = res[1]; v[2] = res[2]; v[3] = res[3]; } /* Vector copy function */ void CpVec(GLfloat *src, GLfloat *dst, int size) { int i; for(i=0; i #include "object.h" #include "shadow.h" /* Draw the shadow of the object relative to a light in the stencil buffer */ void CastShadow(Object *obj, GLfloat lightpos[4]) { int nf; Plane *plane; GLfloat side; /* ----- Caculating face visibility ----- */ for(nf=0; nf < obj->nFaces; nf++){ plane = &obj->Faces[nf].pEq; /* Calculating plane/light distance*/ side = plane->a * lightpos[0] + plane->b * lightpos[1] + plane->c * lightpos[2] + plane->d; if (side > 0) obj->Faces[nf].Visible = 1; /* True */ else obj->Faces[nf].Visible = 0; /* False */ } /* ----- Performing stencil shadow volumes algorithm ----- */ glPushAttrib( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT ); glDisable(GL_LIGHTING); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); /* No output to the color buffer */ glDepthMask(GL_FALSE); /* Prevent writing in the depth buffer */ glDepthFunc(GL_LEQUAL); glEnable(GL_STENCIL_TEST); /* Enabling stencil test */ glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL); glEnable(GL_CULL_FACE); /* First Pass - Increase stencil value in the shadow */ glCullFace(GL_BACK); /* or glFrontFace(GL_CCW) */ glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); ShadowVolume(obj, lightpos); /* Second Pass. Decrease stencil value outside the shadow */ glCullFace(GL_FRONT); /* or glFrontFace(GL_CW) */ glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); ShadowVolume(obj, lightpos); glPopAttrib(); } /* Detects the silhouette edge of an object and project it towards infinity * in the direction of object-light vector */ void ShadowVolume(Object *obj, GLfloat lightpos[4]) { int nf, i; Face *face; int neighbour; Point *v1, *v2, v3, v4; /* The four vertices of the extruded edge */ /* ----- Silhouette Edge ----- */ for (nf=0; nf < obj->nFaces; nf++ ){ face = &obj->Faces[nf]; if(face->Visible){ /* Extruding the silhouette */ for (i=0; i<3; i++){ neighbour = face->NeighIdx[i]; /* If there's no neighbour or its neighbouring face is invisible, then this edge is part of the silhouette edge */ if (neighbour == -1 || !obj->Faces[neighbour].Visible){ v1 = &obj->Vertices[face->VertIdx[i]]; v2 = &obj->Vertices[face->VertIdx[(i+1)%3]]; /* Projecting this edge to "infinity" */ v3.x = (v1->x - lightpos[0]) * INF; v3.y = (v1->y - lightpos[1]) * INF; v3.z = (v1->z - lightpos[2]) * INF; v4.x = (v2->x - lightpos[0]) * INF; v4.y = (v2->y - lightpos[1]) * INF; v4.z = (v2->z - lightpos[2]) * INF; glBegin(GL_TRIANGLE_STRIP); glVertex3f(v1->x, v1->y, v1->z); glVertex3f(v1->x + v3.x, v1->y + v3.y, v1->z + v3.z); /* Uncomment it for "real" infinity projection */ /* glVertex4f(v1->x + v3.x, v1->y + v3.y, v1->z + v3.z, 0.0f); */ glVertex3f(v2->x, v2->y, v2->z); glVertex3f(v2->x + v4.x, v2->y + v4.y, v2->z + v4.z); /* Uncomment it for "real" infinity projection */ /* glVertex4f(v2->x + v4.x, v2->y + v4.y, v2->z + v4.z, 0.0f); */ glEnd(); } } } } } /* Draws a shadowing rectangle covering the entire screen */ void DrawShadow(void) { glPushAttrib( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT ); glDisable(GL_LIGHTING); glColor4f(0.0f, 0.0f, 0.0f, 0.4f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glPushMatrix(); glLoadIdentity(); glBegin(GL_TRIANGLE_STRIP); glVertex3f(-0.1f, 0.1f,-0.1f); glVertex3f(-0.1f,-0.1f,-0.1f); glVertex3f( 0.1f, 0.1f,-0.1f); glVertex3f( 0.1f,-0.1f,-0.1f); glEnd(); glPopMatrix(); glPopAttrib(); } globs-0.2.0~svn50/src/benchmarks/GL_shadow/globs_info.json0000664000175000017500000000043211516033423022771 0ustar takakitakaki{ "info": { "name" : "GL_shadow", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "An implementation of the stencil shadow volume technique", "file" : "gl_shadow", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/src/benchmarks/GL_shadow/tex.png0000664000175000017500000005317211516033423021274 0ustar takakitakakiPNG  IHDRL\ pHYs  tIME &yS IDATxڄْ$I$,fG]]]ճ;`hg0  7|~ؙEwUYf"U3ꝍJp3WE_XP pbv % esyŲ%&i݄80H+pnx| GUO "`"_ #hD}/J! 0_$7v}70!l  !An#&qC$AHAn (v!ح(n}|a!f(HwH5ۧLDP& 6.Dmy]8#{`p؉wm[}n3D u9$ F__ˆL)Hw>f}b3!Jžf7 }0ŕ ⺚FЁz_waz=nqA h}QYֈ2ApkW fNIǨ[.o,/AB)48!m ʱO`c fሄ;h$}kf#eK_?(Ykn6@r p"m'}49zp97Gƒ]ߧ[maD`Ɵ=CvC5ZÆíb7cXɇ !1M=eK\$@xX%&K?P|7 5{ mk[K\okj?v}nRA7ț; .[9ӆ ;,DҲ5l- hK=zn~eۼ}^-b[Pظgl ]=6}c=GgU a pljA/f@ܺ9WN`YJ3c.k%; [7n D}pXڶ$!|v#p!Ny?u:lwq* T=6n_hO~c}vW.S >Qٕ Ȝ )gQMpm t8h< (ő1,q/H1p5a9L꺦A&y;D_ǎA{a&-wݷmm ݄ȏ H!pvW6o*N C%*9)zv$DŽ Qptלa(r,fL0Ɇچ\7C͎L@\wX_f? =3[w-e{P|Kۧ3z^qyWMB`*ӣ>!4B[0Up809 [Ө@Xha{CVH(aBh<_#SNs i}āD:-; X F06[vw RAaJ>bmmd_bFGۺ選7{Tԟʶ{*bޮb;"m*yg>lC79x@'IN3 IFr‹؃B}_ j8 d0Up$8oK"nam-Es³ppYV[~ #fL.=̷R^ tLg7L"dn7w B*mqF#]sm}c{DBO\{mqn1`"n`+R4ct)R{ T-ců @qC!)w:kd1uyi$Hڴ)uZ`قs8h61l0ACH )2 nʮ}kZN/9uCD:{D8i1ae["F3ssnFH b/PB+KZ#@wÝڒmNf+vJn+)4Yoc5Ul7DG 0h)ozEO}1>lC7eb;'a59`K Wt' e/A|x")nb)W7,9/(&'iNFw˨nv"iObHRǤSE/xlة~pCJA{Jbc|r SAjvJB`}T?n0=vX)-Xd!t09kh:+Jg U',Lbl6|z23 V,n=w>'^FL * ha 8 M @N2zIlh@97;퟿/}A ǙJvPAt7wv|cd.=o@rez}kPǮljbcq_ K(aQ)Lel(ܘ1v<|8аǛB9ͩJud t- ;Af[6ԵSV<  N3@5,4G:f[`*;-> v dM`+G{ ,Z*w S=20Fp7Jmՙ!gL@/ P u­qF I[Wr l-iUB=ydвAB Kf}Y:ж!zyK;QyNlBDR1 'jY&6cj*Ė0W*n~k[03zZH2t=cDZ/`EitQ=/@&-xiDGr}"7"Co)t?ֵI7(uv [µ:Zr9gڒW_ mT4|F np!0n/-NJ#FzI`JLs/h2ni4ҝf4c)[e֡^ h4Z@n,Umxitx*zThq4PY%m.!P s/<tӼeo57^$@.Aup_&ӬC27(^hSfFB ]f * Bc!i\qHQfNƕnW̦qgCҏ1 p/J7fEߟ A_`&ô{#oHY6 {7|!mI B$\em5NQn(Y/ m(k!bsgkcYvYJh z_6 k,2R4gG)ntIB3) 71K 1[tF09j@H(;q穋ʠ9ј6dUqHB)xANKYKADjGKp; 5a bT ssp#dڐpǽImNFR;lq,$) 66J]Í*]5m 琢l&I7/͈tzT::c#fa5٥;q|2P6n}ސ6u ;MR-4 F~(ES!iJp h͆عL2>mlÈcI09[jܭt&*{e3N+\LbH6w]J=;YUjtzgbspR btvڠJ;3PL2aƀHNݗ%d1#;ߊ,*bLzAFeTnB{\6AwEhx-QJm1r9ةӨCgp+jE:L`eKKmMi_p{_psfn x(&td/lҍٻ4:=\K0C1΅ R0\+ؙA-a8!ۙnܖWh,9JEjGI Is@,jkg&Ԓh4BQ S ً&RF#&$HWw$)ߣ>FSvnyĮ̈́iR&Bpm,P &*U  ^u[D `BRj0dfӔ!JPSNcј HHiƄ !sВSWWu:s4lv WOknfI:+mMDcph$ 9JcTuh~FALQϱ eHך}Mdd'$Rx&@S+4RFGBB$"]%ѲR6Y<;2 <ԛgL ,s9$ E(|FӜJSƘEqE3CCLˮ${AjD $ҷ~'Ht#[AnDM&)堄AsGgRPP.2,Lr"fȥyJi**`ME2D@HD2Ez8$LnKlbΡCܘ+dM tfaש=~B'cӂ>FͬÛ^~J1#8e! q QHgO29)3R+T i(e{h mm ̊(f}K 9x>2M'L lI<7\]w-&;$MG#(+ѧ(cČڻP ι V2٠f}~,!T.ٞ# i:CarC`KU)^\j5m|p8h-뒙 tVN%R aŇ5ѽa־TM&k ~fr!aAeF1K #%3B՘D@LC$6DI^ϐ&iAFSDɌui5IfiXޞ4EabMqRc6hn8OR熷kh 5aI.U/Ǫ:M}jb+8xAdN06@dDMËޮ ա鼿2M//| 2! ާ78D=H 4Gj4H 0e`mZyҦBN B'uC f+nm-LNd/ŔJe$%[t#7il=i~A.mJi ٠Hhuq$mIARtA 0[M\p  .FwdX fڱ*|{oЂʹȽZ[tpp~G]jhk PcaO4!=/?T'ˏInD휣s}KlN*h.K 6X3#:%u6nf-r;vLڧ,rn*$\e#%+&R6O-b-4^bSЄEןem7b:ûoQ -#|_֟%ϊ>ʑseys/_|ӛ5zy^4?<7K $bUCklyf J^$25k"W'$wQ!J(lc yBϩ]tLkFlfq_#8QM##J'D,Q ȓù}v8}u:===>!?1#Ed$SŽ3N'ҢZ\/&R|7,d A>2j7j4ҁ69;5Uc Dn j 9 $%3& 5[Tf{yxm|WKPN,~2$$jK"  pJ E]O4d=jDE(fy؀uY[~}xyඍS]-6iz5k$^! hf.:yTNel41P3J3MS{(8QԺ "Brhj>?AGW h^[9MXB% uo2w#Wzl9O^+)+YИo"ӆSǣ6Inqzw] t意ka,6Eԥ22GRrp6(i* xғ(noZ^u&C+/kk`]BA PBr+afeVdwwQ xX~ӇV S[u%a23 3YZVV9 ]Bf2o1`Ʈ (Z$ɘ'+؟'+SA&2iΖrc)f)@y?U1϶r=r:eI,Kh YV2x}vdiVt |Ф~o=JxQ)HtUL^:2/1="&\FìT48=H(/ sTN^G/QZ[_P:q?K^@M r7RF%,r8ecxK~vQt4=}SlDo2@Am28aiRBmsx|}jh㔝>>&ܺwG_dShɔ(%N>923U[41N4 emіZ{\ۻdm:ӂ5PpYF~H JbI?9b zL j` $`LXl_o;Od.%>bL45kSNm%*'FiC)nNM)R&3؊o_tC280/-_Z y?%@~ֈY\ks@+!tYIiߒ"UeB B2ʜ mCUÿ !erjzIס5>қ6.d4u%"[/ז"TqQ4QXo~Ѧbf5Wwhv(5QDRx9"/y-c+УS~+"$ْ̆ΐIKiяǫ*\p3` ShBKsńJG[9t IDATu5UC#秔T2Z(J#PRc(_3m#dfk5MWCinh@BQoG|J_懚]h.ǣO?O9ô<HeS%WGMiTcuPVYӁ:z $BMgNpJQ sr1]2ʻf*dM-*o砨 :hT"e[fJ٣4 Woɯ?yŌI䫻\r9n襐Rd&֐9c = -Dk 8fkF|XubԣJ5%k(`M٥pCN%懊W`l@˾X7#Bezr ]O:.̱-0hAe_^>5p_IZ>1VI&dH L Hҍj]Xjk7|ƙ$d*V#2ic8M-EK(;~\8i_ 04dx9c2e*Fre>ǦEA6ȦTFDfu@MI0hDHX2UsT(3yY@OU 2`p'O$z)v* Zk}u7OP%oq,ePdS"R:&E 9ӢcSe >_V ' G$Ow3zZ>=E?^sl}KW[pxUDJ V 3>SQkCKQ %4f ~/lwSy_}/q6Y׏%׮nv9` wf&ԧz¹ޭ珗KJ} d<(x1'}d˅U?1;ǚ0w2u $RD.N_GBXۧ_LwrhsKюQ5dYcl>;~q<_a~i><իĕڸsE9fDeَ1ً2q>LaY߭wsfx\oW^3_O" w߿wO???<0??+-SU]a~8;P$q P] \0G7~IB3$%ּs`R^ʮ%2cs4? Rd=T5qz8m7OPho'IkowXϗjv\Z۲szb<8_L-:'a !p1s؏0oѢ6eQDAx$?>^sK9a_3th޻  wHp? d^"/%R\K(ׇ>Lbл?KZ3٧tBKSK ,f9/xYt[Lm 3}-)׼.˺·/^XKcc_xTj"x>1TK :/^nnFT[szwYm/c&2kbM}fwwnh= w*dsj u%`m 貧*~X7Y]2?z7F/a%Xݒ?f_%u;Ȉj?\'IUhҨ@'y,6;fDMeJ%3`vDފI6N',f'<,Wk˹;DL_++-VAMքRq5nu^OT ĒzailsRm]s'9'DNDd8y S~9 Kw-.K]:YВj)|C˲fu7M熌+b>?ѥ2gwWş"Mwg=Z^$)Fy>~XVIŨPz\s{skPۚzMp<iC?DR^%4+D@gZWk=\*P7zfrmc~Sh`+# '{~x̻yu+*n:6ZNeڔ/7-<>3u^~xDq1Їl~~waY{-!zSו-L6Te ,8KXnT/K˪>[߽z/,:7R5gɮp8~UH>5ԧsӒ H'7zFwd%wP-߮s{wɥ%~^+~^:HM%O0X^oȐD~q ïOb/Ԉ",%WTr.;>nH)o|hmoKH_lH}SJY&VZ?2mɿ:HgV벮%XRzf=V'Mq~jPRSJXC1k3D\j{-=ΙNmA%uiZK@?ϗe|DֹeO9f4HEnkfD|>?_Ooo{#aYI7M:N+0ݟ'Oǯ\?#[q}f|}ʌt>7%l ·7K]S-v-kbZꯎH3iS!Քw>r3247< <9zw?G*BjPvr&r2$Ŧbt-Slw:_k*ωHEo_aMkK^Mt}?@]8gkHZO4ojpWpr:q|ʘk_#b(ĀL39&͇cS&ɭ8'c:K$jWa*k&'wh5oO#riZTw~>Azl2 |˲9<( <-jYp0Άɹ(j/|;h}>;}z-C }'elf6MjV$H'w ڗiQ eVoׇcdMQ f,ׯn{T/ӻ֞ZDC_ݝ4B4`6^M)||25Ͷ#Mԑ~ =P{UBo4cm|~x1ӈw-M/7J"ܥ(E: >ڔ߿8/J]c;t&/B Oe2O%s@?~5)WzqwD,vWz3)+vV4i}ۑ !|ӿ]9g+f衫0tgix<-s]D֏MVXwJZf)VBKom 5F*jُbrM]G]" Vj*jxoO]{zT>ŷ<}Pgsf$U0]F_~ޛK!j|BfVz\s\ 䡸bWn)Ǖ'Af풟;E.:&P/'aGu D̜%l{zĤ >ӘjDt,GU5/#X *3-gNl]—(xJe);H kM6ת4AAEjy8 J>WD6nH30׫c!% B)pbFXNK0(xz&,Z4 $掩f~ZJԇ Fk ͕!`EQ(G[.Ϯb:wV+v_]Bbp{0dfް@Z@_.w@HoRst BQvN"^g r3"UYq-ʣY=skD:CVZ7l|zw~:+]/cNİddel[OBvYћ:ݎ2PҀ6؅hrW xf24\@D>v̋ 3{6mǷ~QuΆ፺~bV'm-j/O<Tm\[W@Y[$oo72Kq=ڼ(L4⬯upk(mD&] .aJJl}7=-"Vo B߽E݇ɞ$;9(o5OU%ӡYKZL0$c&“2JT#E~w?_Dѱ~xQ4]U߫S{Bf7==H@5Ͷ!#%7Jb"Mǣ6ZSC#|xSGB}`iyM4t v]i-6(+Wg{Ջ{`xݒ5bw,㿌{}pV^fŔ_obFscuxⴿ7fBњ+N9w3s73aqR^vZet[䎻 QbF^'ޙW1[&ufJv賎~nUQ#x- 30VTmoF7JbK)Ñܙ%)I訍tx1rޫ'|Ġ>%o0Վ=`:b;?5$ϦbK>q0f6}r^8~v~A%C_ UU)]G:͚;}r̟R绋.%w@g >x`P77̽W=f2ط7~]U \K&̤!kUKhEX1{- VxHzLnT;?=;ݿjMX I`K!R?q%h@;A-%璺tzO{I!36sKw~oϿ)E|0?Ucﯺ<A h".vኘ-fOxZ|܆_<|vv[Rxvj]_j{CZ&s5m3A^-6϶bǤsUPW*ֲM随n>er[1|#OrʰM Z:j^L::D z^ s%ӫKMmĖ'DC/JG5v &h-EUs8lJ4Tw/r;m2 b&> Uw5% ^=~L[ 07:֒\ ^׻1u RKk ?ڻ Áܫ:{Ls= uCI)ʏMnf wT[Y}O𚀄ItU.L;dunDPA*UzS/ARm ZFw lU_h@wndBkP*RKrtILS#I}PQ_zDpIDATtbx8ݺ峾Z)[SITuܶ-{\M͵YܵFPvN>xVmN넶c'ȿ4/_VgzWf(h>.~ɓ/>Xۻۚ$0%(\'օṕpH \\uVֺ2GdWL TjA(:~pYj署ANαݛ"JF KjPCm=UQ̦՚16@磞*ַ!E6&F1YԐ ;ul4۔JJ"_o=!B OUGq!oEM!3AJIѨlw# woߛMf^mRdFrͩzVb7=P-@LKCᮆ>?nq8_x<mC`r|Xq }bw+s5Dǣ,<lD] i&f 0d5!8!v l;03a*Vjg*4e;CYDu )UMQx}:eCVS3G59mȊA#{:^u)1#}GcV|=} \}XʞRwnX `P <_ֿxy D.{tX-Y5dW_uT1T/jMBx4a1slI:|L٭VSsk,9j{Ï˂'2;U B*C dg'=#lalBvw[})?eq~T?pmt⟜x4 -]j6Y|k'Ϸk@wPqu_pTJ^v\k~~̈́x:&7UiD" 5_\bK;J94MU=P:55gR.Ƹ^ZQ;:10(潾[}<ã?]Jc^\?5?=< btfQu+0+L$J>7L{ 1kBPQ}6WJd$f L@jZD"*Uavu!(r O6Z/C@wèvIlLxYs)S!~QlC;(FO\nM|mVrI_YGI+vP+G3/zbFy416zR?4Ҷ!?X+[9h4Rc`ng;x0l==;8l?S9OpKGh-479 T_6۳ÔoCuy'ὧ^t5gr7}TIݍ5׫X}6fљOAU[$D,V3ZXIOeފ`&B.^23b~}x(v,ޟoE[ y.6Um̙*_fN+'{g7ǁ1!|ZtgàBg2.¬X 5+p.y.2Hdv+/E].M !m/Ҫey4W6劉ˋUL^ L:F墍ʪrd5l /1kj2#`zߓ.]Lw bO.~wv.6!DIe1~_[ӚK)꫘H+yũ:|eҒ5WGNr\ K#E=1}Kky/xC ,_]8MNDq&H/zb Bt yvWԒqP%~C.^^~wZZ" wwB O,m@]U ȯW "B>>oAR\bDk^_K1GKrٱ*a|Al ڨ*)橺ijTofz΢<]e6"'Ip*1Oّ)'Ac}#q"pB@Q[(cB0[o˗~:Ԏ.UuhyFPoKow!}us{*t :o%^Dۜ__`?L% b0UqMV>Ns`Q#1d՜(F&LHIzCT7{g9 l4D=-YU3Z4S\K5U &ކ0ݷV]w.aPˎ|i(fɺh\=mj#\ u77#ct}MF@Ĕkm[-YuBHmW<5-W뛏n@Ƣm}>Er;lSFjq2G۠{; eNA,YDD@q2ܬY͎1]C, |qv"Z) u02֛=8RB)R6yݖo?ym@"O`:X$FU5[PMjuoZ?p)_$Sq|V-%ěHIfٝ%4ݖzg]\9^8d9ւ׺^s/Ƭbb&&`ܞt;GcM (?Hͥu*z_o`b`:7L`۩Q%͐j-v#4}pL =KtK [ !>ӗ I7 h9puVTW&aPtv=IN%:Hl]䧽\wr(#0}XQ@{†c#XEvd Ej:1Xh ]XX1 5nfH+663%k|?i+.؜ \;sw:1O ???wT\Y;Gz2|+$:0IҌJ6Y3.IGOz&"-C=wQz0#wQ^ *P%3VD '<ɴȌ` %>KXE8@Ag "0HKh1rfFbG 0q1:3i1%KܼvW BnE]]b Φ6U}uca^ N t8c Kl$s(R ( m"_&>KDj 5;!*bq5`*H)uHHnv" NaNۈmD'L)1l$>3GȬqdJ _E.'BLTp,Jj<)Ф3ȭTC)Viq#bDɉY( tO!aqUJI'bFb^ uE>-D]Um>A!D rTy~KHF`tHH{.rE [ b{Fdc!YIZZYوaȪR)@U2wB b6Fu 1:)@r7΂T*Tg<1mb ftL,Rh j"Q $6iBeʆy6]ZiUd-GTe`mE x uش.SL(8 -w@QZ`ILD>V9O QdLBGgq!DW C1R8KBT|kgC@@QIʄI9(daR> dNFk ԑB"jlrnmiK$x 9= AhAIXzs`)Ʈ3o}NKCمJĊc$>gp'DH\3X"T'm C* <Gh|il8Pj .r`&$ FVuOł BH-) F$uq s[q˄F-3XD %D` 9BzT@t(owSlLu) TA 0iAh(V#0#ϲn& dtv+1ے df'D9WNٜ$=vh \g?T4zsGJ%6B"g1!u$p s4&rYж.We:-N%jx74Zi€# tnqY"Ya}`ύIIt¡ LҢOEX0/}on)10@'0i)$SQH։% B+O*W!oaLjBh5g|$ JP2C00B49H˴&Snޣ;%) cr[X'60z%;h(q;F@ 3Sߪ . L =}4HZ Uyd^scζĨIWsYRH}/1$D 9S;vraph9oNje"S!j-|h-a3MF 6i&$Pb7dsjhqfn֒(N.I Mu~)IENDB`globs-0.2.0~svn50/src/benchmarks/GL_blit/0000775000175000017500000000000011516033442017424 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/GL_blit/Makefile0000664000175000017500000000077211516033423021071 0ustar takakitakakiCC = gcc LD = gcc CFLAGS = `sdl-config --cflags` -I/usr/X11R6/include LDFLAGS = `sdl-config --libs` -lSDL_image -lGL RM = /bin/rm -f .PHONY: clean all: gl_blit gl_blit_ext gl_blit: gl_blit.o $(LD) $(LDFLAGS) -o gl_blit gl_blit.o gl_blit.o: gl_blit.c gl_blit.h $(CC) $(CFLAGS) -c gl_blit.c gl_blit_ext: gl_blit_ext.o $(LD) $(LDFLAGS) -o gl_blit_ext gl_blit_ext.o gl_blit_ext.o: gl_blit_ext.c gl_blit_ext.h $(CC) $(CFLAGS) -c gl_blit_ext.c clean: $(RM) *~ gl_blit.o gl_blit_ext.o gl_blit gl_blit_ext globs-0.2.0~svn50/src/benchmarks/GL_blit/README0000664000175000017500000000712111516033423020304 0ustar takakitakakiGL_blit: an exhaustive example about blitting sprites with OpenGL Copyright (C) 2005 Angelo "Encelo" Theodorou Info ---- This is testbed code for considering the inclusion of an OpenGL blitter inside the game Mars: Land of No Mercy (http://mars.sourceforge.net). It has support for colorkey (working the same as with SDL_Surface), for further transformations (rotate and scale) and it checks for maximum texture size. The program renders a quad with a texture in ortographic view, this is often much better than blitting pixels directly with glDrawPixels() because the majority of non professional cards do not have hardware support for pixels manipulation functions. Using textures leads to another problem, the famous NPOT (non-power-of-two) textures, which sides measure a number of pixels that is not a precise power of two. The problem was solved in two different ways: 1) with the GL_ARB_texture_rectangle extension, which avoids the problem for ever but needs hardware support and could rise performance issues (which are not, of course, of any importance when we're talking of simple 2d quads ;-) ) Please note that GL_ARB_texture_non_power_two is really not very much supported at the time of writing. 2) drawing NPOT surfaces inside POT textures, which works everywhere, is always fast but adds some lines of code. I tried to keep the Sprite structure as smaller as possible, but you can make it contain more informations, in order to do less checks and to enhance the speed (but again I think that a couple of log() and pow() inside the blitting function don't afflict it too much). Consider the hypnotic background triangles as a special gift and as a proof that we're effectively inside an OpenGL render context. :) Compiling --------- To compile use the included Makefile which takes care for both the examples. It has to be tailored to each one's needs, you would probably have to change include dirs. If your compiler fails, complaining for the lack of the GL_TEXTURE_RECTANGLE_DEFINE, check the code for a comment with the effective value of it. Notes ----- The origin of the coordinates system is the upper left corner of the screen, like SDL. It makes more sense with 2d graphics. Together with the source, in addition to the Mars logo, there are two little png images rendered by me with Blender, you can use them in the program to make your tests. The first, "sphere.png", is 64x64 pixels and is, of course, POT, while the other, "stick.png", is a NPOT 276x54 image. Just like glxgears, each 5 seconds you will see framerate information printed to stdout. The program has been tested on a PowerPC architecture system therefore there shouldn't be any endianess related quirks. Extras ------ Here is the first version of the blitter function, as you read in the comments, you can use it as is if you don't need some adavanced functionalities. |-------------- /* The old and simpler blitter, it's ok if you don't need further sprite transformations or NPOT textures */ void BlitSprite(struct Sprite *sprite) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, sprite->texnum); glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex2d(sprite->x, sprite->y); glTexCoord2f(1.0f, 0.0f); glVertex2d(sprite->x + sprite->w, sprite->y); glTexCoord2f(1.0f, 1.0f); glVertex2d(sprite->x + sprite->w, sprite->y + sprite->h); glTexCoord2f(0.0f, 1.0f); glVertex2d(sprite->x, sprite->y + sprite->h); glEnd(); glDisable(GL_BLEND); } --------------| globs-0.2.0~svn50/src/benchmarks/GL_blit/gl_blit.c0000664000175000017500000002553511516033423021215 0ustar takakitakaki/* GL_blit: an exhaustive example about blitting sprites with OpenGL Copyright (C) 2005 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA NOTE: This program is part of "Mars, Land of No Mercy" SDL examples, you can find others examples on http://mars.sourceforge.net */ #include #include #include #include #include #include #include #include "gl_blit.h" #include "../get_options.h" #include "../check_time.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; int quit = 0; const SDL_VideoInfo* info = NULL; int width, height; int bpp = 0; int flags = 0; Uint32 interval; GLfloat angle; char *imagefile = "mars.png"; struct Sprite *glsprite; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); width = opt.width; height = opt.height; /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; /* ----- OpenGL attribute setting via SDL --------------- */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(opt.width, opt.height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } SDL_WM_SetCaption("GL_blit by Encelo", NULL); /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glDisable(GL_DEPTH); /* This is a 2d program, no need for depth test */ /* ----- Sprite init --------------- */ SDL_Color colorkey = {0xFF, 0x00, 0xFF, 0}; if ((glsprite = AllocSprite(imagefile, &colorkey)) == 0) { fprintf(stderr, "Error loading the image file!\n"); exit(-1); } glEnable(GL_TEXTURE_2D); glsprite->y = height / 2; /* ----- Event cycle --------------- */ while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch( event.key.keysym.sym ){ case SDLK_ESCAPE: case SDLK_q: quit = 1; break; case SDLK_F1: SDL_WM_ToggleFullScreen(screen); break; } } } /* Exit after 'opt.time' seconds */ if(check_time(opt.time)) break; interval = FrameTiming(); /* ----- Blitting on the screen --------------- */ glClear(GL_COLOR_BUFFER_BIT); /* --- Rotating background triangles ---*/ angle += 0.125 * interval; glMatrixMode(GL_MODELVIEW); glDisable(GL_TEXTURE_2D); int i, j, ntri = 10; for (i=1; i <= ntri; i++){ for (j=1; j <= ntri; j++){ glLoadIdentity(); glTranslatef(j*(width/ntri) - (width/ntri)/2, i*(height/ntri) - (height/ntri)/2, 0); glRotatef(angle + 10*j + 10*i, 0.0f, 0.0f, 1.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2i(0, -(height/ntri)/2); glColor3f(0.0f, 1.0f, 0.0f); glVertex2i(-(width/ntri)/2, (height/ntri)/2); glColor3f(0.0f, 0.0f, 1.0f); glVertex2i((width/ntri)/2, (height/ntri)/2); glEnd(); } } glEnable(GL_TEXTURE_2D); glLoadIdentity(); /* --- Moving the sprite ---*/ static int mv_flag = 0; if (glsprite->x < (width - glsprite->w) && mv_flag == 0) glsprite->x += 0.1 * interval; else mv_flag = 1; if (glsprite->x > 0 && mv_flag == 1) glsprite->x -= 0.1 * interval; else mv_flag = 0; /* --- Scaling the sprite ---*/ static int sz_flag = 0; if(glsprite->xsize < 2 && sz_flag == 0 ) { glsprite->xsize += 0.001 * interval; glsprite->ysize += 0.001 * interval; } else sz_flag = 1; if(glsprite->xsize > 1 && sz_flag == 1) { glsprite->xsize -= 0.001 * interval; glsprite->ysize -= 0.001 * interval; } else sz_flag = 0; /* Rotating and sinus moving the sprite*/ glsprite->y = height/2 + sinf(M_PI/180 * (glsprite->angle * 3)) * 30; glsprite->angle += 0.1 * interval; BlitSprite(glsprite); glFlush(); SDL_GL_SwapBuffers(); /* SDL_Delay(20); */ /* Decomment this if you want 1/50th screen update */ } /* ----- Quitting --------------- */ FreeSprite(glsprite); SDL_Quit(); return 0; } /* Allocate and fill the sprite structure. Create an OpenGL texture */ struct Sprite *AllocSprite(char *filename, SDL_Color *colorkey) { SDL_Surface *temp, *image; GLuint texnum; struct Sprite *newsprite; Uint32 key; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif newsprite = malloc(sizeof(struct Sprite)); newsprite->x = newsprite->y = 0; newsprite->angle = 0.0f; newsprite->xsize = newsprite->ysize = 1; if ((temp = (SDL_Surface *) IMG_Load(filename))) { printf("image width = %d\n", temp->w); printf("image height = %d\n", temp->h); int max_size; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); if ((temp->w > max_size) || (temp->h > max_size)) { fprintf(stderr, "Image size exceeds max texture size, which is %d pixels for each side\n", max_size); SDL_FreeSurface(temp); exit(-1); } newsprite->w = temp->w; newsprite->h = temp->h; /* Check for NPOT textures */ if (IsNPOT(temp->w, temp->h)) { printf("NPOT texture, using special code for automatic padding\n"); GLint wreal = 0, hreal = 0; GLint xpad = 0, ypad = 0; wreal = (int)powf(2.0, ceilf(logf((float)temp->w)/logf(2.0f))); hreal = (int)powf(2.0, ceilf(logf((float)temp->h)/logf(2.0f))); xpad = (wreal - temp->w)/2; ypad = (hreal - temp->h)/2; printf("tex width = %d\n", wreal); printf("tex height = %d\n", hreal); if (colorkey != NULL) image = SDL_CreateRGBSurface(SDL_SWSURFACE, wreal, hreal, 32, rmask, gmask, bmask, amask); else image = SDL_CreateRGBSurface(SDL_SWSURFACE, wreal, hreal, 24, rmask, gmask, bmask, 0); SDL_Rect dst = {xpad, ypad, temp->w, temp->h}; if (colorkey != NULL) { key = SDL_MapRGB(temp->format, colorkey->r, colorkey->g, colorkey->b); SDL_FillRect(image, NULL, key); /* Without GL_BLEND transparent areas will be like colorkey and not black */ SDL_SetColorKey(temp, SDL_SRCCOLORKEY, key); } SDL_BlitSurface(temp, 0, image, &dst); SDL_FreeSurface(temp); } /* POT textures */ else if (colorkey != NULL) { key = SDL_MapRGB(temp->format, colorkey->r, colorkey->g, colorkey->b); image = SDL_CreateRGBSurface(SDL_SWSURFACE, temp->w, temp->h, 32, rmask, gmask, bmask, amask); SDL_FillRect(image, NULL, key); /* Disabling GL_BLEND transparent areas will be like colorkey and not black */ SDL_SetColorKey(temp, SDL_SRCCOLORKEY, key); SDL_BlitSurface(temp, 0, image, 0); SDL_FreeSurface(temp); } else { image = temp; } /* OpenGL Texture creation */ glGenTextures(1, &texnum); glBindTexture(GL_TEXTURE_2D, texnum); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); if (colorkey != NULL) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->w, image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); newsprite->texnum = texnum; SDL_FreeSurface(image); return newsprite; } else return 0; } int FreeSprite(struct Sprite *sprite) { GLuint texnum; if (sprite != 0) { texnum = sprite->texnum; if(glIsTexture(texnum)) { glDeleteTextures(1, &texnum); } free(sprite); return 0; } else return -1; } /* Blit the sprite referring to the upper left corner but keeping the correct image center for further transformations */ void BlitSprite(struct Sprite *sprite) { GLint wreal, hreal; GLint xpad=0, ypad=0; if(IsNPOT(sprite->w, sprite->h)) { wreal = (int)powf(2.0, ceilf(logf((float)sprite->w)/logf(2.0f))); hreal = (int)powf(2.0, ceilf(logf((float)sprite->h)/logf(2.0f))); xpad = (wreal - sprite->w)/2; ypad = (hreal - sprite->h)/2; } else { wreal = sprite->w; hreal = sprite->h; } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity(); glOrtho(0, 2*wreal, 0, 2*hreal, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslatef(sprite->x + sprite->w/2, sprite->y + sprite->h/2, 0); glRotatef(sprite->angle, 0, 0, 1); glScalef(sprite->xsize, sprite->ysize, 0); glBindTexture(GL_TEXTURE_2D, sprite->texnum); glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2d(xpad, ypad); glVertex2d(-sprite->w/2, -sprite->h/2); glTexCoord2d(xpad + sprite->w, ypad); glVertex2d(sprite->w/2, -sprite->h/2); glTexCoord2d(xpad + sprite->w, ypad + sprite->h); glVertex2d(sprite->w/2, sprite->h/2); glTexCoord2d(xpad, ypad + sprite->h); glVertex2d(-sprite->w/2, sprite->h/2); glEnd(); glPopMatrix(); glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDisable(GL_BLEND); } /* Check for non-power-of-two textures */ int IsNPOT(int width, int height) { if ((int)powf(2.0f, ceilf(logf((float)width)/logf(2.0f))) != width) return 1; if ((int)powf(2.0f, ceilf(logf((float)height)/logf(2.0f))) != height) return 1; else return 0; } /* Calculate frame interval and print FPS each 5s */ int FrameTiming(void) { Uint32 interval; static Uint32 current, last = 0, five = 0, nframes = 0; current = SDL_GetTicks(); nframes++; /* if (current - five > 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } */ interval = current - last; last = current; return interval; } globs-0.2.0~svn50/src/benchmarks/GL_blit/gl_blit_ext.c0000664000175000017500000002555111516033423022073 0ustar takakitakaki/* GL_blit: an exhaustive example about blitting sprites with OpenGL Copyright (C) 2005 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA NOTE: This program is part of "Mars, Land of No Mercy" SDL examples, you can find others examples on http://mars.sourceforge.net */ #include #include #include #include #include #include #include #include #include "gl_blit_ext.h" #include "../get_options.h" #include "../check_time.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef GL_TEXTURE_RECTANGLE_ARB #define GL_TEXTURE_RECTANGLE_ARB 0x84F5 #endif GLboolean have_rect_tex; int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; int quit = 0; const SDL_VideoInfo* info = NULL; int width, height; int bpp = 0; int flags = 0; Uint32 interval; GLfloat angle; char *imagefile = "mars.png"; struct Sprite *glsprite; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); width = opt.width; height = opt.height; /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; /* ----- OpenGL attribute setting via SDL --------------- */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(width, height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } SDL_WM_SetCaption("GL_blit by Encelo", NULL); /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glDisable(GL_DEPTH); /* This is a 2d program, no need for depth test */ if ((have_rect_tex = CheckExtension("GL_ARB_texture_rectangle")) == GL_TRUE) printf("GL_ARB_texture_rectangle extension found!\n"); else printf ("GL_ARB_texture_rectangle extension not found!\n"); /* ----- Sprite init --------------- */ SDL_Color colorkey = {0xFF, 0x00, 0xFF, 0}; if ((glsprite = AllocSprite(imagefile, &colorkey)) == 0) { fprintf(stderr, "Error loading the image file!\n"); exit(-1); } glEnable(glsprite->textype); glsprite->y = height / 2; /* ----- Event cycle --------------- */ while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch( event.key.keysym.sym ){ case SDLK_ESCAPE: case SDLK_q: quit = 1; break; case SDLK_F1: SDL_WM_ToggleFullScreen(screen); break; } } } /* Exit after 'opt.time' seconds */ if(check_time(opt.time)) break; interval = FrameTiming(); /* ----- Blitting on the screen --------------- */ glClear(GL_COLOR_BUFFER_BIT); /* --- Rotating background triangles ---*/ angle += 0.125 * interval; glMatrixMode(GL_MODELVIEW); glDisable(glsprite->textype); int i, j, ntri = 10; for (i=1; i <= ntri; i++){ for (j=1; j <= ntri; j++){ glLoadIdentity(); glTranslatef(j*(width/ntri) - (width/ntri)/2, i*(height/ntri) - (height/ntri)/2, 0); glRotatef(angle + 10*j + 10*i, 0.0f, 0.0f, 1.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2i(0, -(height/ntri)/2); glColor3f(0.0f, 1.0f, 0.0f); glVertex2i(-(width/ntri)/2, (height/ntri)/2); glColor3f(0.0f, 0.0f, 1.0f); glVertex2i((width/ntri)/2, (height/ntri)/2); glEnd(); } } glEnable(glsprite->textype); glLoadIdentity(); /* --- Moving the sprite ---*/ static int mv_flag = 0; if (glsprite->x < (width - glsprite->w) && mv_flag == 0) glsprite->x += 0.1 * interval; else mv_flag = 1; if (glsprite->x > 0 && mv_flag == 1) glsprite->x -= 0.1 * interval; else mv_flag = 0; /* --- Scaling the sprite ---*/ static int sz_flag = 0; if(glsprite->xsize < 2 && sz_flag == 0 ) { glsprite->xsize += 0.001 * interval; glsprite->ysize += 0.001 * interval; } else sz_flag = 1; if(glsprite->xsize > 1 && sz_flag == 1) { glsprite->xsize -= 0.001 * interval; glsprite->ysize -= 0.001 * interval; } else sz_flag = 0; /* Rotating and sinus moving the sprite*/ glsprite->y = height/2 + sinf(M_PI/180 * (glsprite->angle * 3)) * 30; glsprite->angle += 0.1 * interval; BlitSprite(glsprite); glFlush(); SDL_GL_SwapBuffers(); /* SDL_Delay(20); */ /* Decomment this if you want 1/50th screen update */ } /* ----- Quitting --------------- */ FreeSprite(glsprite); SDL_Quit(); return 0; } /* Allocate and fill the sprite structure. Create an OpenGL texture */ struct Sprite *AllocSprite(char *filename, SDL_Color *colorkey) { SDL_Surface *temp, *image; GLuint texnum; GLenum textype; struct Sprite *newsprite; Uint32 key; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif newsprite = malloc(sizeof(struct Sprite)); if ((temp = (SDL_Surface *) IMG_Load(filename))) { printf("image width = %d\n", temp->w); printf("image height = %d\n", temp->h); int max_size; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); if ((temp->w > max_size) || (temp->h > max_size)) { fprintf(stderr, "Image size exceeds max texture size, which is %d pixels for each side\n", max_size); SDL_FreeSurface(temp); exit(-1); } if (colorkey != NULL) { key = SDL_MapRGB(temp->format, colorkey->r, colorkey->g, colorkey->b); image = SDL_CreateRGBSurface(SDL_SWSURFACE, temp->w, temp->h, 32, rmask, gmask, bmask, amask); SDL_FillRect(image, NULL, key); /* Without GL_BLEND transparent areas will be like colorkey and not black */ SDL_SetColorKey(temp, SDL_SRCCOLORKEY, key); SDL_BlitSurface(temp, 0, image, 0); SDL_FreeSurface(temp); } else { image = temp; } /* Check for NPOT textures */ if (IsNPOT(image->w, image->h)) { if(have_rect_tex == GL_TRUE) { textype = GL_TEXTURE_RECTANGLE_ARB; printf("NPOT texture, using the extension\n"); } else { fprintf(stderr, "NPOT texture detected but you don't have the extension!\n"); SDL_FreeSurface(image); exit(-1); } } /* POT textures */ else { textype = GL_TEXTURE_2D; } /* OpenGL Texture creation */ glGenTextures(1, &texnum); glBindTexture(textype, texnum); glTexParameteri(textype, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(textype, GL_TEXTURE_MIN_FILTER, GL_LINEAR); if (colorkey != NULL) glTexImage2D(textype, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); else glTexImage2D(textype, 0, GL_RGB, image->w, image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); newsprite->texnum = texnum; newsprite->textype = textype; newsprite->w = image->w; newsprite->h = image->h; newsprite->x = newsprite->y = 0; newsprite->angle = 0.0f; newsprite->xsize = newsprite->ysize = 1; SDL_FreeSurface(image); return newsprite; } else return 0; } int FreeSprite(struct Sprite *sprite) { GLuint texnum; if (sprite != 0) { texnum = sprite->texnum; if(glIsTexture(texnum)) { glDeleteTextures(1, &texnum); } free(sprite); return 0; } else return -1; } /* Blit the sprite referring to the upper left corner but keeping the correct image center for further transformations */ void BlitSprite(struct Sprite *sprite) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); /* If textures are POT, we change texture coordinate system to that used * automatically by the extension, so we can use the same code */ if (!IsNPOT(sprite->w, sprite->h)){ glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity(); glOrtho(0, 2*sprite->w, 0, 2*sprite->h, -1, 1); } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslatef(sprite->x + sprite->w/2, sprite->y + sprite->h/2, 0); glRotatef(sprite->angle, 0, 0, 1); glScalef(sprite->xsize, sprite->ysize, 0); glBindTexture(sprite->textype, sprite->texnum); glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2d(0, 0); glVertex2d(-sprite->w/2, -sprite->h/2); glTexCoord2d(sprite->w, 0); glVertex2d(sprite->w/2, -sprite->h/2); glTexCoord2d(sprite->w, sprite->h); glVertex2d(sprite->w/2, sprite->h/2); glTexCoord2d(0, sprite->h); glVertex2d(-sprite->w/2, sprite->h/2); glEnd(); glPopMatrix(); if (!IsNPOT(sprite->w, sprite->h)){ glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } glDisable(GL_BLEND); } /* Search for extName in the extension string */ /* From the OpenGL 1.1 Programming Guide */ GLboolean CheckExtension(char *extName) { char *p = (char *) glGetString(GL_EXTENSIONS); char *end; int extNameLen; extNameLen = strlen(extName); end = p + strlen(p); while (p < end) { int n = strcspn(p, " "); if ((extNameLen == n) && (strncmp(extName, p, n) == 0)) { return GL_TRUE; } p += (n + 1); } return GL_FALSE; } /* Check for non-power-of-two textures */ int IsNPOT(int width, int height) { if ((int)powf(2.0f, ceilf(logf((float)width)/logf(2.0f))) != width) return 1; if ((int)powf(2.0f, ceilf(logf((float)height)/logf(2.0f))) != height) return 1; else return 0; } /* Calculate frame interval and print FPS each 5s */ int FrameTiming(void) { Uint32 interval; static Uint32 current, last = 0, five = 0, nframes = 0; current = SDL_GetTicks(); nframes++; /* if (current - five > 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } */ interval = current - last; last = current; return interval; } globs-0.2.0~svn50/src/benchmarks/GL_blit/mars.png0000664000175000017500000011376511516033423021110 0ustar takakitakakiPNG  IHDRVc pHYs  tIME#*+tEXtCommentCreated with The GIMPd%n IDATx[lqV>f` @$$RA$[aЏ_` XjZ#/C)%òda4iH!ν8's#ϩw$!#Q(TU=g̕+WRnֻ>>KJ$'?qsMV5S|-_72d2S7WGgNL̀>ulFN&7>g2-2Ϝf"^WN?>fXױT v^4f̿ӯ&;f}7Vtc9_kX"&Ove,/[&Q6ŏNiUox^\oݬ<Ꮿ— @;'H*BԨL ?sjüZ$1S?O@g_]9=x-$;8Ol$\?]>>Ȯ}[}oCx:<@|R}=!/f~Awr( S2ӵ]ZZff6IU=>'gg!Yef#T/5;.eߟ&3#9 K{g'?5R$w n7;Y?>m5Y ,SV@lsVOideHTffwZ=]cHLo A2)O׽d |z}ggS2u_ t@zp5!oTq}p TjVEL:fO]bH]+fbzSznw8k,PxEk̽*}Ы¯Qtʭd9E!y Tk" @d+5+NԤɊ _<]vD7|gU f-1ڋ:J쬞/k"l ->{oW0eSݬg:PZX;g"c~cաçiVm 01"b65b~6^ #މ{7gtF'48j0 } F3'-ӇƑ<32`aЭ۶ZYm9DPyT"!]e9{3k-ds3Hq,L@:T&,A6)3%@j ;[;Û3 JdJ)-\*+P!*SRi (XA$yL?AruOt)EH: P9"n< BU/! ٔA VM,䷌^ #SpXŘDJ ŒE*=%e2b] f9y+*As=ǁd+/T"Ua$(,&չ~Zې"8j@TBnJ~TOD2 2Jd]D %D+C2LKO"OFGY7ϰIDAsIV9dAvVC8'?nbDir 0*"ICQ 䨤jYiD@dHPJeA&Վ?3,9d`*$6HBjU)ˌY U9̼Ɂ *;KH @C3;"ISBِ#RJ )MIqd8r($e} @fp)gf iP^єpTT!=. &4L&NW7{!-]kT4ƀ- iL")9#T^I•TG8''ce}H:Ȅ)Oh}_+iBq'ʌ9k0Cfv[NBA< J`gӿx7n|o x"HCIfHR4Pi`DRL/&TSL(Ag8rVE0\)TyjRVA$)1*Re R0iba7P&3 3SiLZIętpPr@zYӘ&fl̈́ӑfiL aC<$ Y& !Q JaH8%Pt!{+ S(!8 $ n7[8C@f?Y -MQ Ͳ1iF &C™6 !LL#)ӁTII#`$!u,OLA3\+S"s=q(jλsg H S 4D%*H4dlg|PӦ7)0ҔG!+ґO*>sҘ@3T)*D:n*gĢBͩ\;T8pc7זqp5Ӿ4S=-,4/ʲ*wN1Litjt# J$"(s a드ͩ*Hȥa}ƽP,I0RF%)RMHj# lpIn,+:x$pK`6u$P( k9 1er)7$([UR^sǐb4A,z@AL*j VW#"'#1S^}HU]0!! LY7S ƠTۄ;=&| C%沋)4Ff6K"-7":L<-96Z7󂞑8 LiȾ5MT)dCʆ=l0Aۆ ݕMvs~$XYH$J)fe, (F5SBn)Y3iJ /јNrhf#`UN$L0A)X23f=Kl3" `2@-44edk{=}c93i: X"˜ނSÄ 6fkxIli"L2Mj; 0٘9LKZ0)a!PY䆅 HfЈ19cfwDeb"iTif&{ϟ?kRIDTL75KiE'w5{v3l1a\pOtާMf*n /X 6^V0)S8Pp[ ?^0u4L8Š]^Hi1Mg;HOoޣ>3_ʚ; nL2YMEZn1 0cgsA^ MY2ɉfȐ19hiD6L |^fY"NɁlf\t7$4SU;wTc39d3v[y6S-Z,bnPOumr> {LfӒeK*|̳rٷt01cƪD=##2Y5lV*K1߽{gWxo)xw!GXF5zchf8!{q|t7{<5BQf0jN_7Ca_Fl E)]Asm4(: )\8nw; #;$i33B8U5 py- k~?{$֚%-}9'aHh]Cû<;SU*j6٧Uoi{6;俦-S %ou%slmR5 i\c+ T\h32 ŖRVݸl#!6ST8G:IGظ6j1鈥Gd0ӌ69lbL>ې-٭vfc1P} 9 H"#qH;0.,M`X7.qq0,N%khZ'pLEXG/Qv~Duuz[k_acA@d_fYVSha[e' LS݃@#dR'H \8ɀq\7ξwMhUinllF7 ]KJ}Idg fH7Է4diH:R5fJRf 23[ȞL`*Die"o,%g%T%"!W:޶~̑+_^#C*@)tt™>ބ~ )ca,Je3u;9']4 _U#: u "E0\miHlQmPZqEY6Ht!!ҕ9bFoEѡ-eG4)RFY%nd䢴z` }"-S a%F;?O6H qdٜQ=ye3p=5s.:_VkΧקg?xM3|JvϹ)er aZ 6!Wv&Ju25Zg]Ef 4F6RF5o0#LzO 8p ˙ ̀Ds@4@0!M0yZ޴li jfY拆@_(mțǕ[oߋ3̯k]/?{ '5ro~,ůyBu ?d~Nyk9B ugצ [SE\pM:3wtE2jgghFiܚѝfn@sr76(MƬfT(,k Nu op!lԨWײ*:A܋`D3ڤ8YdL IUMd8~]5f9>-O+0k5^׈?]khϬ|wNIH_<]sYOIX$FDC"Q{EYVm^T8 * TtcCJ։f;Ft& -zdL2'qj!H"Gs--{&FAn@4ZJ#A; A `&$u9)%k/BDv h R.Qt tTwF:Ш0'%rs` "i֌#jɚP8O[# (d.'y[o4)){}vx+װtH"S,u$d9H"'(xLҧ p35 ~|nw! jĪӲ#aȨN }_Fb':GVۍFzmmD\f9BP8\Èa s3љC2B!uf"(t5rLC*Q!v͞9u8÷ " P FPٌl6inF$E !OND(&q;DFjf4X@5SƜTuRDd0@skBV lvMR)_^9~tt;x[ c9- .43`V?Srj_If \\ֱU>f 2(U-eAo_xs܎xٔ3ψEۋUQ{o_lm?F~S[z⵮m8~ճ[VA5(ThFZf]tI~P7 P>Itw$3v3 Od ͜u23J&o̜d Gx!@aj;nd8Wwǫշ a&^7,GY_?hշ问vcn|Q"q|4[] 7be\iY4ٹ:KyU A0GfZFJ&1`iL0 * V皘isPzRǞfl9p9Z^*Cx@x3&Zr~t)eϟǔ׾m ڄrU%QnLU1 f%3N7ɒOlOqqo::qUc!^ی_zG W7Wˏ:9 6cCi9k՗R6 n ]`͚T؈m&`g1MBF$ffHQΰ.S'3 Vu?X%[r*|LsFðHNS( -bF|^9If%gy8FmrL}i(z[xR ɉ?O}[lͷ;=x>u"f۫xk牾k0s/O޿vap8o D m1vuAsD"f0nSɆԾBN))6NH.Ⴀ;*QfWݍhAZ# ?&UN8وddTtdf|"i˙E!5X]J<u`k7B3vzMs3]mnum7ۓEbxR  ;"RkWCǴP0Z¬/ڕFl#vK8_IW5odȨ!hTG!TkhJ {#p f6>2)88}K%k8TW &S^p׫2ͥߥb_I2s0N'9QÜ+6BSMN %w4h3-pf송wh GC,m/Av߽vqiEag5~|f|yQvȥ?t7c~^ߍ_xybETr&;4Nu°lv玺۝I\m׶xA*xKf*"CԌ'>>2Nx&Rp f$z&ѬA%t"kyNX)y :s0IٷךUwu)c4`b+h'Z=Լ>|+7 j-HK)YB_N Hic&h%}yE>Z)XcP)ƷjLR-|v~Mƈ..Nzk7nPVd] r3{?J޲l5̚,JVa?6]WB R${蒊'Mɼi-Ee*c v(\i)Z9ESKlgF҄ [i SJ!1 a4d#[] I BKRƄ@#MwVwN0:n쯀gA <G/a2."̬>F:J<'vǯ^r8Im|$٣[́zk7[[?Qf4 7Fœ"b_|cs玻U]̫ǯ<шϟ_=>`xsZw9G:޺{|vb LŮne ef)H2ALI2`,88UQ#ʦPBH*Wjܻs1F/Z!$"$N]0+LM(%C:5aF$8ZU?G@1 Jε$ Wit!l۫ŷ<{/}~|}c;ana;lMcprr1I>g_}t~tr&~L:*LI2')$*N4Dh*M]{XJil:5Cr~d} xT,YY9u;O]e"2(YdrETL1 #HZ?0(=$UҘFiNR3E{d۫c6ٷ:Ǘ_/"EHXuWê.wwVn0YFGmfVn.CP0]w8 Vq_ܟtvgy\G @QxԵx]H.5={:f||7|?}fZW')xx0_liv}UJ'3@ce@!H"p vFNy+4d0= ИzLtAdyy  .vs99Z]=>_//ӚtBX|>>t:SW0͍Hea6: WtY^l<37Hic7/>6|²3'(a8';Y.*@v`$6K_(]'毅vpT.;YW vwqơo eRdF*AV pbL%_gQlJ% |L-a_\0 wwG[Y^-'ux]^-ۗa1j\xo]hDNz}7|xٽ0b['7naJs(m-UI+xJ~(T m⭓i%ZŬ^Ҳ#ҠfYs!U584yN__?~!QiHU8@VSf$ZM(qa1t Ct̛&3$M1Q%NlP3aDd] } w}~٫EG xrl7./Q^ūIJt"]m6;n1 /o/卞q>nM.w\ WC>{}۳_yH]=`NWx쏼>wc1q>>8tfWm.uPfϩ_ ;[5@_R7 JM%5dJ< I3To4E5"hKfD":S r 8F$2M?U[Mb 0Јe׎{hzh2_8v,Q[ݫ1pgyYH+6#5ƇIgm~v70fjQ(2j)A+fyR{eN9T)(@ѪٔtDoIX +gvΣ *r'5nu|kǎV98ߋW$ha7Ո>RWC7~ȗSWp,=i"ƋݎpK°1VAێ=;'[ ߋrt[m>f璤gG0vcQ'' /q2Q} ;^|7V4Oٙ,B5+"DLn9)E(EJ2if\S1$jAT%uX䟬*.[Ώ3VxT X34I1)Cj\=5|"NM8%Z"3xa *vUj56jlG5QGc75ܗ%mU%]G+wkvc>.+o|l~GI p>w,w}D؏w%jeF=b5[\ݓ_3~{>%(qnf3V}[uh&"SJ0䡏`ȥuO%H1qA DI EKƒKcd7@ШXL.,guFBS_9Mo9ъ#&mi, N-JG!dL0BEU'GU/ۇ6CGJWWji-vDD -Z0>6 axm{hC~2F|B?}܏f?ܕb-װ fvx5 }eW緺w!uƃһҦ̐q۸#ۻ=m?wy&;J FjMf5ÀԪr7[YNũ"aoO3 Y)rRؑUWOꓟƲ10 M!jR#3%E#1q&9fR)WVWDf#ĚLa:MLTP >eN~؍lu0wm[}s}`_t9 9#wm3RYfO_yKAᵋh\u1tݣ_=|VwdNMiܢ$UIn]P t=s4Sn."1r2(daR -3i7kDylw\eꙩ@ɉD949frB tLM HMh4bmF&һ&(nxwVE9yg, vXu=6u ǫ8Y,^mޑ ?u9:9'G>"Cڍ܌7ݹ2f72R;9"M[Z,z {/۟Y)i`ktOV~sa.r~9hughfWfs+Cn޾x؍a0Se"0 L޼*!0UO&FC:ZuZޓ)mcp{%!a"Q ӨOſO*N;]wLGcAy@Kl\IX27S=rsk̃T7L<;P&R>g\kz߸29[O#c޷&ȍvkAZK7䘙ðE<$E:: _\Ųkݫ|*:è4k{x޵~Ȯ-.^]Nk=,eh` fՀ۷1{@GiZ450MMz<"  Kxvsn\-wRxhy=k-ӄP&|(:1 LhI^%kB0&mtiP<%QVTVG¡xL)3ߑ$~|61ub>Ar8?79)RдnhMJh*Ŧd"Dj9P}tM'蚚4fO~W~Ӝ\V'w?_'q?~MD ݘtՊ K6^:]>2,Ww24t8WkP6Wcn#]p- l!?i ~5+_~hW{(mx7 .}3_.;9~KE M1sófZ"Ь q7D5RpXvզ0搔eYtHF݄'( C{ F"eUq Y6e}բaw=d5f:{Mc5~Mt*}f"W-n-bcdN<9]ǻGY#ɰ{vxٹ EoEϼ(J;ޢ_@AǽGëjˑ?1gj}_}{rWG}['uj~d^rGWQ䝧kW«߹|ӗ/aJ|ivgw;^7{vvoZPA`JE(GeఞhsF#qs nLګEgV L2IKZuLcW&i&tEee.K1)@HS8T<8_7l5S[nOu12MJHhD Ҋyt`ePH}y{֖vyi?jrٌ6>f1f}3թ}yМDITJؒHY yQ y 5U@O}*)"5$^CTFBD(m Cst Ó#3u}̋ŧZ6͠(!;g7.ƀ^{'lmZb>wɾ/FTF w[mI:k4JitjɖaAP&+\4MZ$5"@D"{GN_Vxt%  Q ڿ\0Ӈ#= JFAV0虭vM=~gX:klR[Crzc蟵%(QtQ-;oz7Dq jX 959:΢ye%M`LszbK7)B'Ɣ{B IӖR!Fb44G"*)5 Sp7AC d$CddA|0ZPiA k,WzpYONHhz>e>`$B} PipbK±1'k:HSxc`ۀΙC2gtĂbt~MA$HٯP0$zí~1*>9 ijaDA.m h洜C⡣t )$ VREB%RKh"~@e4&9FE*23sU (=G5dY@NbąiNW e#Ls\l$UD ް  )\j\z)$@B CpD LcJ7J+FbcJ"DMMQq[O=EDL#titZL"J u1H@I;H( 8DLĨmCF9$Mz? IDAT: F$()^zz(#cC3ECl!cb"BK=V*]y\6QlpL.(Y2Ҩ]`-< %BpU4rs$F`mha<"B$5JBf"yf"bD1e∊jV T$:13i #*3FC">su:fiH *bQFYmE@ Ԙ0rOJ1SjOeJjKC~ƀf!(#94ȌY%'!3(r9 RczC8""BfP`L#PT#Y<f'5EhD䙝g" \Tz#r[kT1gs?SXw2 ޓzq s2Et6wJD $GȓLХ#2"?SF 03a "D19z"E,Ҋi$PA#4IP-dd.=G@lB* I8U#(9X5FRdY2Z0X"CdQ.8c(ʢYDj @=rܠG #u'һ;C0R+r@BFfv@B!3̌M'2QIb )+zA"@tDgD顖 Ϧ*&$a7o+0qMGJ*2Lk0/~VID˔>(#0 :TO)Tu޴fɪiSeB . (Rzә@\ns@Ȇ)FـCmDM* dBbBb"6{ ULqTd3Bؒy>]9u8IC\I0=,;q-gMl"bwTl3^W!o)b(絜#Df(6. pޙc9kBl_(!t4S&ޛGUӉb0q*c쎠5 n% B4DE,#)i~s$hl"EMeD1Z,MlL4DȤ !LG($H"gBEc4d~j kd&*U'^x!BK$1i4=ԡ9TGeLLؚگ>=ZHE5m."C+<?aH& d` Ac49=ND#ǩEƃ[Vgmm_|ƻI1oj1OD3'jAUټmx{޾yܙN3] >~yYimTAp˨;m^>jgM`L.D5\n-"иܥb0aT$U%4bG]@bim&M 4F}lrop U 8`g`^m3[v3Q`Mmk&yy%/κ|u_4<g M5j{*g&&dF$dEf@H$Jh)CG!!cQdFB1:M$}:狤 OE!ILIcop/fsİ, XDLcP@#q`C C[yhUݽUu;ߒxm)}y)Op342T>1U kM0kGM|8vwnmnwTTc%"gu7n?%b#V_3p Ja3?[Պx}p3x0kִONp#ۺxX-τ[G[Ek!D sƍ I43R17έ9m֪އ~[Q4xz>ѾuvʋYsyzUq;}($261!X_J2ɋrA-ԠyԾ8 "DT;%8%gYsb!oS)J%# /?g? /BMTi4&Ce2¤L1A]& r2N E*q̂ӮP r J& Uy#!@UL%n3b 8U8\`g]:jBFQ =8`6V wф2(/|_ĨYntuu)$s)pUQ4톎6bQzgEuqIpjf;eieeyFRkE1Q3ԺhR+X5Qbl73kKw X//;grd*e;E&Eqv6Īk!j㴂Ɇ9F2 b:) tDj,J3#B,2h5CN 49ՠĜWSCs௏̒=?d&,-q~/T6;bSYb  @"K`I̴A0UODY1@= 9,rgֺVzMVA׆7 z`)v/?W>5ͫNޘrgYwYE,M04Vyfg>7o.jۈ?ߛ'=RrZWNo7ESM_W;5x0='f8h:Ery`:Unؽ@7! o̗[*|n*&ҹ󵄽qfX ͘#8L`,*Lg{:hg2<ժ%ī9F3(JA گ_m2]wo_qĹs1Ӧ EIjw*9;5"Qv0sYsuC/  0k*!w1nnZ8Co.S׏/^>5}|t mieiDdr^u9\~\ucd9@a Ǖ9LQc^>Sr) >KJ7~*iAd` GyڼzcE;$+ށiv8CIVdhp_X.Bx,R`s'#a{ߩ,`;ղ'{:yݕ#Ra#Ϟژ}wtynLr4 rێ9Bt _4>8C$:\΋^9x0} Z1󞈆[-e렲ġ!aIFpKR{TҞkp1şlbr[/6|TZᣂQ .᪶6`RlnuLfgEip%M4[tqȍuΥPw}Y:l3xPޝ7-3=-;;'w-Q:m,wNbSy;[rZTp-lFQPuzg޽|T ?^ݿG0of|q],Wӓs9[AE3v!&lp.\݅5A+ÓW& = #tϛy#ȻjWӜiȟZ9_]K#Afzѻ٪fy}wӲx.6{ܟ.aJ/"t ph>wf-_? /tT i|MegXʢd"e=βt)]3_hNWw͉ ` tfY E4̴Ҍ/B.ை*klIBvևQGjF`d@łkdhK}e0Qolxf431bfi,K8?<;y$g:oōɈ^=[|{wV'D]baȿsg[Ӆ$g"iTW?/8[t2;BDLبp%L|zokn=Ηxյ!VD_=>!$r)"&O ^MU7m"νӢ!<3,Byro*~%3j&6m´Ӂ漏Cx؃mc&Eᢴbth1 @h[TENug}1TYZn]_;[msG "aF6tZ,M]u*|b{7G<:5y& Eם-ja]44Ta.`NMY}1 4[ c8H`0ܬ ]P;kgVDt[pCeGשׁy}O1Ʀ6;uP8xn|z8okK`;~;3c"$Uu^C]ߘws>F14 [EEg^sG&%Zm )>A g3]dl6x<*BokW\mU5fyFAyS.GŦ޷Q 3G IBDue\g(FyeYuiLt* T$Xxi@Ƿ;<=HؼpM翽h?9aƮn]*Ji8(Y.ò,+i[lSE;<<9ğ{;Ym8YGb==#-i-4HI.&ˋ/%)xq|{X_;vqXOQXOqU=62_Zk.+YwZ6Z#MV`_clG'N.0!d fM6>PO6jޅ}.߿5w5վ,U b$/䮉ڈubM-*{dG&ڎM'ݐ#]?e_6'03,KG2kL5M]ӫvӃ߿w(apNk}+Qz?$rV9xC?|lv;6nVc̈LZ'֊ g$Gw7pӛ#rcXkAG`g%Shݳ?]bxxnhxy8z9l`VF[{d|sΑ.IV.?F(èAuH>H-#"6_\QƗO϶Ɨ`$']pm`|.RO4N5Qd"ͮJp ]iG%.QDZ4kUzoݚu.?[w޿1ӣ7VǮnwz`6&X D**hlts$bE)"Hu>"#*@H=Dg$ؕݝK)ٔ4*F0`jӳ#j)`0M-vj~=ucG0- PN̐ǎPc[zof|h|~<^FDpXfNC\CBC62ټ$k=r< IDATE'\.Sue9ӽY lo_}4ܝzg",вZmN^+d9c9̼A#N~|W8|P[],y~9;o>5Z2eYe(hOOgAQ`oE? b i|o9릙tFu:KW<5 |z<1*Y-%UYWAc@mOH 1=v̬?cvѼfyЬ \wY:ȺO$Yd9vVkq-{{O pkg6eפS@ {yfUd(u#Xǣ߾9-Ă6i3e+uQ4Ѧn͗YB5d"9 2j qiKYU'.j{;kZG9Sif?| 獜5qJPsI @m *xit\w$g'n"ccFlUI .kU6U5~noD 1M\m}6rq#aF1qQ8@rxV{npa\=8_TQ!&cZA?w]>7߻2 1)'hW{}.-{TaT .f傘4hDumYRCbT5hoMۡ=\⍫37l?nb'vji}dP>=q_n`;B:maصa!{G.Lx}2OM7W洽Ī.6AEdw7n;x0l>{7oU+4|rw;[X[۟_VIխB*]h %elm#>}mjl R$.G+f8El_>NC2[urſ=%||0̕wa NGe'潪V!0 d|Zcós=9\N'E'M6`;;;n88wFx|4 b9KU[BGnQvl:"x^"v.r,dݽWxv qł21s'Jg776DU -f-Y.z9YҾX[wJc0zl4 ̽ە׸8#NIJlFΐ Ȁɜ3vĂ 鿤No]zey6}uf'ma%63?p.w4nU- 2$@nIɋ+4]IS]jMmh9sАd|yNN m&jT0dr, s?zl0 |suvڸ줊 FA((*PPlsG>.l'4\򎈆. b9-_x=yARv@Eu׊̘'J-bnw<m$w#ՏP͚ӬoZ2oqmw?=}yY~zs!"ACOaQ\SX(4cbѫA狫phxyks|糴V("|>[Ѡf;u0kn=jLכX@֛8_?M?Aq.TM ELV.a6 5Eğy:,MU-C%!,A}̚)Q-ĉ9,MMɶ6n̿~q [&!2g}a7mwwnG$lk_sm9n]6l_hD"w_ͭ}w.N}>iSvwhGw׮L>7X[40я$o#o4!oo޷ۯ\tƷΟ>6;.6>xh3ϒHXRF4_h8zɁ%7oAnv'vc78vo~(~"d}ry}?~!(,ɉ?ۆNӭ ;アyk~jMo\G_߽gn=9o?q'nl{3[`ݺ?KWʨ٢e&i0Hn#o ԧM"UCj `!HH)%)Н`I=|衫.o^Ef 7Nf5 TQq#[?;ܝG8}uӤ:v!i=|]2m* T;KHi׏\6Mf^<е=7`/UC'C''q<}V|gKfW^y7uێ;6ӬZ8ă'|8ӐM~su~/ZO#p}o;3KmT7kӍ~ًoϷ-h>;m3f'^vY`9t?y#ZfΫyhz}G߸ӞGk99ݧZ37u "8>Kx7+qh 6X!v683  i^iR'k4eRihTtFu*\ LdLZ\ҞX3¸p^@e7Aڤ+3[9_LW-˄f3 }Ȅ<ΗnW63Y"3nlM n*eohɆK,󍷓K"gWlw2O6Av˭}މljXxOȃo?9R*XRMT)LK5yhQbYE/[*ZˏoO_\>_~257[LW7'N Aڧ HxOE\Ԓ8 )"Ѫ.i܁ւ=3ͧ֩F-,{&HҼMZ#J L;{AŒ4v m3i ϤY 1`KRٙEM^DD!#NZ`ifG/*3rdҳW*UW5"gs)Pvb%D1), jMiTL %4M.b 14C^Sh9Wjzt7nZ[@"i At[2w}<Ș:>9[ۃ'C _v xj_dRj'L3|(#O|jɨfw=2IdTż22"}mg{&?1 n&XH9_BynEQ hiAb Αǵ^k2)BX&dfؚ)؝G_R|TG&;B5FeA UǺ (sQ% ]%lP^5=vK-j $k N)dMn4r]ˎޚ$4JYѣf̦E eta횮vݢ JC52[V:- vmZm|;߽ҮfKX-i0kI7,ZwGXjq J#SR A*IH^'_NqA"]F5]4;>27kMJK,Zy$kVI-Ue*UëSh#Q ,'~?zf?8)\\r|7'f40--Q!{- 1S -wey_|_&4J&^*&pq"2&ZHo*CM(L[2 Sfe",c.m3n'5/k#k69e\j3'"e,z"<bkXI:S Q F̽),TQ&>۔( &:F!l*fșp!boDfLE-vzlT)3|}Ck-)b r`-A↢h !&5fQ. F]9ousmbw;*a phݗdV^H*-e.P;>o=Z;DLSn e7Լs#1H .3!}6L"2\i 3b֊KLH Kz?xԾ'2"a!6N)+t^A ZT%S̲9N9&B.NJ퓓4"ْey{|#@-YN*Q(! xd2TDׁ )d!9#MQXS^[T'YU¦6/EZYmmiDD pU졢r#[`sjưZ8z`H5A{06:W^Xj^d)t^7F+fã`˜%sƠ޾ux)G@&Flsaw2k!T+6evHxB9+QZ;`ZXnG+^6X%&*)TQJ+PVVxo| KAͨT m&EX@L^\ L|0$ⴂR9P* H3De*6I㶁>a>UR0lb8R,^ ؇L$ n4+kWfOu/ͳb;X TY*Q]`ʫќ}jNJDfł֙@'eLQ`Z( B`Mv'm8&*} HVc'iQ=Չb1F3b5]UmR>\D3 c7J”Cª4`U= uحe/\lɥUNnSLXK6%Ke|0H,4EP;[(Ps LZc!HKna omݧ/aL1*G_k$|gߠ|tuƪS@wjkdMLdZC&*nvRi;IDATw]*H#l23rmK2&ڥ5E,M[tLY0v-vH0ZL0Vu3"RFiެ_;KpZ:8I-^-n}l_ATtJfzf܇]cnTlRјr}b#]؃3wi|%bad_3]N-a0;{D7[ˑ9YK-[5Σ|Jy`ΨDazK3֊sge .aw1Q<_?HrTzR"[2,No g#؆Ϡ7Vnw˝å'Ito 뺉-lK[9B`U|nx?Ht.HI\2'FF yK_7F^Uw\ }͇t`& Z8P*|Vx^ؿ O1~z[n I'}~aECC.l!y66+` sֈkZaA%gCR?k/ۜ9^xۮUZs(:S_b IetO.:#1"{5)$_CVame{C Eō*u;{h!;.IX%9t.cpw{8.Ԇ]:g9WjSV-o#߳" 7yT` _9Ū? /yUd b${A1zfV?']r~ѽ?>ɋN>Q-u|_k5? ~KBb&_:eg!oPm*OmKgYKGN)~zJCRX\z)w]KQ/$K>=YC> ~f2tıGq/F&ypo5lu{dc QCd.CrƇ !Xؕ?Q(2W훯J4OvnIefNp)]?̍\DKpqqɟgr/):*7ȧzf)T8{c<昧q_Y# ~)_Wya#K- *dA߅, @]qhNU@Ӂo[?){еA>=[4(jBj|eÀ KG5@#:["0o&ճe24^9t *7ʥ|];+i$ tu0}WRLwﳧг-~k=m[Y^O_Ӻ~u,^r]e%u3إ `ʋ]-C˘=Y7:y&*l`JZKdGf]n%W]N(^kcMWq5#`1@0ċ;Hn_xd^W~Vf> $Z} l}_!^$LJ:Il09p7oUpt )je R`zuP7H 4$.Dή=qSςeeY31*:24!`"eHV t@7q9[+?!ͣ 4Ds_9^jUBǦ=2Co!e{]U5tZ([4%/Cdsu,mr<_ct>x&41ɼ~ndwZ],aO.XB_7cQ`)U9f^m1QBweP3!{Dex͙y0KԶf5HcwkG:-UZ_Jzt~ЛQ[#}JjS /)xwSǣ7$]o{=5岫s6v3ަ{C_2[s;#GٌiUcƥ|`TF¸7{_F#f3_@'&&1];9\J?Z &.Cf?+go`ɨ[J[RE?;h *&~ 06DJb[4Ơʗ^0 T*</zK Y;dkꆢhScg[Ok `h>fb2Cտg}|l_c?dR&ja[Th",, !$K T.w##]J3¼as3b +kY#.3"mTXoy@slpۼ_=ֲ̍~&HM-V"DӛOc:=ILl} I&=)53؁"?uEͳu}d)|CpP V} 1غru Ay s3|N$˗ub)L{[jڭv1aD.F&gj':9 O>zv^ѴK0q=[c?А UK. !c[%eP+|dByt7˯<=-i6 rq%{OhɠX%Gr/rGm9ۂ;aB cm:~m8f:x ](oZz"pbb$c|Qڛ=2u2~TAv]|pz@2~+\c K ~橭xYvr)]ڰr{.)W9F_=~oCFu'^Zt%wʻ}Icmb ~edjYKU/ctJEÃkj\.埻:ApyzNsVR#sJm@a6W/D3f/cK?mP WRK8CKgOm1*BQ>},L(~u\PȫYvcjAœi3Te>Wfs-ixyO k鿧<by7W3ʄՀ4ȏ>}` WylҿjˁU؜G:TTO9D;{L7J^{#?>P˰'?W_so' 8i]ʳBQ)>;&KmD4ZO䭡d^s /KWFĺBҌ8tZ^ß۞(pwkΥ8ϡsj>sٳ+>=:g@RqqF1wfdkɸ;v# JpLQeKe!^}{kg*B}Ql{ZD7O_RG !wG꺯x W[$?}}<ڞH@dWmylj^Dnc16{ `ζqto%|GPF V\ tU[g(Ooؓl᪹?wzI﫣F2WX8Jr^Ts8brW#ſ Y mث'T+ Ipb*$I7)Wf}jxPѻs|IJ x߰*%&u5d.ɬs2nf=ͪ|̚;NmQ+R*$ 3 '7O_KU?yuF/}|~{jk϶X/b>[vrlz]weVG_lxlՆKv{ߏt IC=xh*)$ B6x+!Fc9_kG϶W4#~hju^=~WxumtPR_H~n{_8AtF8~<ot*PvW;vnE,>yvzXVr ixOW_F+Ƥ /mKݾ'/T;UCbkCx_:ۮnV݃ۊCtMyq`֕=~7>v9 kپWoO{lsgfyݗ\A+p|-Ǘζ_8~~{ #@twwYF"7/ cߡ_R^+mOr;_ 5>~4E-_ɐƄ/m/mƓ_.ͬV.E%=24l*ɬBPf"?G>^GDs>#o7OG~l?go\!2J')[+R/mOO53~ē! ^㏾goF"Wcv@~P-_tA _hoV?<afrK /o忂L7y[9-}i^.TU?v7;}s?~x1<~'^E?vv0$IENDB`globs-0.2.0~svn50/src/benchmarks/GL_blit/SConscript0000664000175000017500000000071711516033423021442 0ustar takakitakaki# import variables Import('env', 'install_dir') common_src = ['../get_options.c', '../check_time.c'] prog = env.Program('gl_blit', ['gl_blit.c'] + common_src) prog_ext = env.Program('gl_blit_ext', ['gl_blit_ext.c'] + common_src) # Install if install_dir != '': dest = install_dir + '/GL_blit' data = ['mars.png'] env.Install(dest, 'globs_info.json') env.Install(dest, prog) env.Install(dest, prog_ext) env.Install(dest, data) env.Alias('install', dest) globs-0.2.0~svn50/src/benchmarks/GL_blit/sphere.png0000664000175000017500000000401511516033423021417 0ustar takakitakakiPNG  IHDR@@% IDAThZߋ%G>u3M"0A|1䃊 "AXV6! fP" 7gwv];LJs]9Cߚ{:UFIl `]Ӷo3lB0nf$"pXq`¸sO/BYdf03[c`ď1[Q0G }774_ 4N/jhVE"zkKU@DD[Oͣ ,,3uD_ZBÖ9C-Kc*tyxdG/D! ^%|xE!HP *B:\x{PU"RUcL|;+'W(:Cd|,B""}{a1wр\^zP)zy4oU9, p=%fIfcTUUF//nPkH\aPCnއB䁫hti2Lƣȹ Fڱb_wy7CD/^_"}ﯤTF˟y{{{[[QpG(wIC$M.6tq]$S2ww^_vmʕݝxlѐ5@Gc><p}DU ї.͜8؎ݝ?wsԸ`|6(@bfTʎPO}fG8#p{N &_|s_idž(Iz;*]p[.!}1[W9aHD Mzbl4 6K$p&t6E6UU4Y\ZB "2d̉@t&|nmj!'?EDChڲ(>x?ٿGZ@ KyVRx:޿<={NNggeQ4~}iBSjfBC15E`80gӳt:'z鬛pҙ5]V#pslZ*s"sYE1/,Kԟj4*A%7fʢ8?MϦt6,,Ks`0:LBDB~CZ5$gn|}á*je?Ejݢ+~IjC!kʹ! qCǜ[ǥ!uz⹠MQa YIo{ߨ"RkuuNiT#ondMkBu-QTT˄j\O !3'qc}7WlZhF=UKDc7{$}8QXjDT4& !ER7llL2ei=N}9cPˁ ryDGƴ+L}Q!M N^6=oHݜb,3pǵaplSMp̼n3q#'}@ҖjQttj񶧵,\񻶵~6u~ Xu3Ʉ hjӘt "& *ɑ w613dV+>_B _iT޹~jֹu2$R+> lc Ik?Tܡzr,͆<\pzB8wUH~T"@D_9;X_ ߏ]x`_{g7ދa-d縻I}!4a/{\?\'{Fz>%^8skW(?m{[[I.uv4~F)=.˿)lwRfE6Kz%uqG\u:wD1K6LOxHuaq礵Q>-l4zFC_H"GvJII)N@59Uk-%3[ҿOAe9r4.ޏC$7Z{0^g6@sT~wh:`ZkJz}'c?@{ݶ `096?@ BANx67/vz)Ű9l|Ơ;`7Ghcוs #vgzsllv{/ZkekRWzR[gsg tsBRkUO'<l0jJBp:gx6~l5s|mV`sxNMl֯'w#1 VOJo<7CSض[C< ƧdB` w&TsvF R &'4>hDgHٟ`:)]uC~e_nڇcM<6CxSmɾ9f26v'(F/?EM"!%5<19\,ODD,yMF~<y_8Qk9m[H")lf^]z&ÐZOβ]{wl0a/Z`Bjql1Wꌅ8aD1%9SU΀˥t7DжmeΗwe yK)azR6MN`J|>7*\k|>sQkUZ+nԶxzq@4 n/#sƞz?/]F"B_T nH˹>Og!CYqȏA4 We4$3(:ma6GOu1r~UG፩99AEX ,  ÔeCy#G9:~y9;g2_e$K›W;Jqö V#HkakȰG#t|сd!U {jmK+_EIʼnf"6ox Q̼ S227h9:k[R磔RkRj(9_>zejs<1J$ISs=}/%۸}̃i4BD0B O ~dH" wVz4P ӠNzuzV , &?kgkhP|ғ:2:}OIJțj\?qnYqdK1ug f١2ZC/N;kVwYAt ,SxH- .)} O yf&F3M:ُn8t#mK8Gedr%Ec,wF(;ּ˜HȤi.=‰2CU:vEMYqE^x~Zk;Ns"LY696i =bf̳Li)Y^)bi,HRbguC[D&|4a3K׬i [HF,gt2`6ߩ?~s2%m4 痢!r@e3|!'h50ޜQ}?\X1:o;cO )Sk*.782st9⢂ ,A>lj&𫃓s҄_~U˳ 848ig|5Hozz@8͇$$],o$S]S*MNz5Miᜒڼ?J]O&=~_.s)| )S\l*4ӟ+vD9^y6G;8҈3m$-.ea:L&F4-ՔrYT,[Si.;l$:6A&"/6oU#%ECP%gHG?f 9~" 3aJCD!rN Ae4Wͨe!o4~h-n `pG2+g8rzt4;) B3Cz{1'y^Az?[0S.OJ1 +C Xӗ!S} x@Ha!DBܚ)kg˷ZH0$dPhsDPqB<Ⱥe7@K%r)kړx!4#X mЧ#d(O Aߓ9+x&wVXW@ &e :S4I]kaw)E#@wP6!E\ݲ7!bQ _<o X8{ `kрᤝ)LFu`1חbw/< 귇_<fFnL)z4bnIs)Nqjjď~$PjvyԇyT155SR6A  #1"79_9^ȰH'JP'̮aWdGs "t-qSհܳBQ!cd$m\ &NrdX߷ qdH\mkn29{Ss?+iǀ~VМ$X33|!\nͪQQ+illF+߯BjvlQ# %.Fx9 .%m E7GlA>:;W^ϼ">1Rl+NVxs: DD.d*۬}Zz6t[hmb`)HPMIJ;^U^L:\ b`%<n0R1NNC#'P B E2bJgH4yYAQ5ʪ'=!~pb ͬ5 vV8lN[SPz>?oS u@N@KzpFaםT7}e%9,-SQ3 90p T&& Džѵ8>- |LH<]=Yĺ5rB0a[g +@S/JATaDUm|j$;%_T}=k(t4rM_P[y9є@/l^zڳ`sTQ2Wc<ّ`B"Cw$;}*t󙉢}fj&\3GԼp&΁Ә7imdB'Zmy]qhnc2 gT=4*(:l7NMV(зJA}Cg|%He,}G, "7 ^//K .&ZN/uXWj 享BU}_d}'vo^|ԵZULj-b!*f%5j:!^ $֡k=ٴǝ8u=G5mw[z~K82PjIB 7{6жFB)%!J`t]II/tDM38Or,gG}>09t@«5a% |,gnX^J/':Yԑd4aNL]RDp?u|pɾ?sD+ƆꧠcCva=>bN[/$ӯpצp܏aBes6.c/'wW)S Gյ Ftn$!_5;sԮ朵Sa+UTIQF bKMK>6)~I],JY.ƹ|&aEs/O0"4ȽKskiK: [6^Iaw\SGc.m!Z[΂HQ!--:y@[a#9vX>`(U¹gêf" pKpy:DuuWu i(ar u+.EWS/D""BNBljݟAH4r;&侸yV1?v5R'HF:93q9'! q<4[8#_a92>b ^M{k]q."hQi$b2"%%Z'0&HQ!m ԰`x_~FǑ,O;wKx'y/;B~EJ磐3 i:K#B*ҝH*>H@LcCuܯ>]6t[B֠CclM8k*y7|p.ji :CE*8jگ ?63Eqzg|XK#IJ{ܩ&Yj x<ԱArHav*OB別Yc1se۔' ؜빃7yn zzmR3?-4V#D"9 dv-Vrڥߡ?]cH+{XJB@8nuKl-P^5sR>{O:2꧉F;q nn3gϷ?5r ?sjEüa,WSWžv|mh2wHařw>LhYwאcFSS0w [ E`ԧ&dlY(B慙eZCpO[vi+x<~ۃ OcÑnmЩ3SC?"k=fE_XvK.twg\voݤvrDbR4,rOo^xAU|iom9-or9~p& X{_+( sS1ܒI.t3 Fv&k$QCj{ܹ\( :V Zv/ Q쵌zkp@¸||Z(>p`pgtjEÒPq?ߕLtsy-ƪdZ8x*u.5;*=9ySImh`䌀 QQ|+SF2"A(/sG77C#CպUVe!#: IENDB`globs-0.2.0~svn50/src/benchmarks/GL_blit/gl_blit_ext.h0000664000175000017500000000074611516033423022077 0ustar takakitakaki/* GL_blit: an exhaustive example about blitting sprites with OpenGL Copyright (C) 2005 Angelo "Encelo" Theodorou */ struct Sprite { GLuint texnum; GLenum textype; GLint w, h; GLfloat x, y; GLfloat angle; GLfloat xsize, ysize; }; struct Sprite *AllocSprite(char *filename, SDL_Color *colorkey); int FreeSprite(struct Sprite *sprite); void BlitSprite(struct Sprite *sprite); GLboolean CheckExtension(char *extName); int IsNPOT(int width, int height); int FrameTiming(void); globs-0.2.0~svn50/src/benchmarks/GL_blit/globs_info.json0000664000175000017500000000116611516033423022443 0ustar takakitakaki{ "info": { "name" : "GL_blit", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "An exhaustive example about blitting sprites with OpenGL", "file" : "gl_blit", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} }, "info2": { "name" : "GL_blit_ext", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "An exhaustive example about blitting sprites with OpenGL (with GL extension)", "extensions" : ["GL_ARB_texture_rectangle"], "file" : "gl_blit_ext", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/src/benchmarks/check_time_sdl.c0000664000175000017500000000057711516033423021221 0ustar takakitakaki#include long int check_time(int time) { static Uint32 current, first = 0; static long int nframes = 0; /* first initialization on check_time first run */ if(first == 0) first = SDL_GetTicks(); current = SDL_GetTicks(); nframes++; if (current - first > time*1000) { printf("fps = %.1f\n", (float)nframes/(float)time); return nframes; } else return 0l; } globs-0.2.0~svn50/src/benchmarks/Fake/0000775000175000017500000000000011516033442016756 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/Fake/fake.c0000664000175000017500000000075511516033422020035 0ustar takakitakaki#include #include #include "../get_options.h" #include "../check_time.h" int main(int argc, char **argv) { options opt; error_cond err; /* ----- Gathering options ---------- */ err = get_options(argc, argv, &opt); /* ----- Main cycle (frame sync) -- */ while(1) { if (check_time(opt.time)) break; } /* ----- Quitting ----------------- */ /* printf("f = %d\nw = %d\nh = %d\nt = %d\n", opt.fullscreen, opt.width, opt.height, opt.time); */ return err; } globs-0.2.0~svn50/src/benchmarks/Fake/SConscript0000664000175000017500000000046411516033422020772 0ustar takakitakaki# import variables Import('env', 'install_dir') common_src = ['../get_options.c', '../check_time.c'] prog = env.Program('fake', ['fake.c'] + common_src) # Install if install_dir != '': dest = install_dir + '/Fake' env.Install(dest, 'globs_info.json') env.Install(dest, prog) env.Alias('install', dest) globs-0.2.0~svn50/src/benchmarks/Fake/globs_info.json0000664000175000017500000000043211516033422021767 0ustar takakitakaki{ "info": { "name" : "Fake", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "A fake benchmark made to illustrate how to write a GLOBS benchmark", "file" : "fake", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/src/benchmarks/get_options.c0000664000175000017500000000205211516033423020604 0ustar takakitakaki#include #include "get_options.h" error_cond get_options(int argc, char **argv, options *opt) { extern char *optarg; extern int optind, optopt, opterr; int option_index = 0; static struct option long_options[] = { {"fullscreen", 0, 0, 'f'}, {"width", 1, 0, 'w'}, {"height", 1, 0, 'h'}, {"time", 1, 0, 't'}, {0, 0, 0, 0} }; int c, ret; /* Setting defaults */ opt->width = DEFAULT_WIDTH; opt->height = DEFAULT_HEIGHT; opt->time = DEFAULT_TIME; ret = NO_ERR; opt->fullscreen = OPT_FALSE; while ((c = getopt_long(argc, argv, ":fw:h:t:", long_options, &option_index)) != -1) { // while ((c = getopt(argc, argv, ":fw:h:t:")) != -1) { switch(c) { case 'f': opt->fullscreen = OPT_TRUE; break; case 'w': if(atoi(optarg)) opt->width = atoi(optarg); break; case 'h': if(atoi(optarg)) opt->height = atoi(optarg); break; case 't': if(atoi(optarg)) opt->time = atoi(optarg); break; case ':': ret = NOVALUE_ERR; break; case '?': ret = UNKNOWN_ERR; break; } } return ret; } globs-0.2.0~svn50/src/benchmarks/GL_smoke/0000775000175000017500000000000011516033442017610 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/GL_smoke/Makefile0000664000175000017500000000061211516033422021245 0ustar takakitakakiCC = gcc LD = gcc CFLAGS = `sdl-config --cflags` LDFLAGS = `sdl-config --libs` -lSDL_image -lGL RM = /bin/rm -f .PHONY: clean all: gl_smoke gl_smoke: gl_smoke.o particle.o $(LD) $(LDFLAGS) -o gl_smoke gl_smoke.o particle.o gl_smoke.o: gl_smoke.c particle.h $(CC) $(CFLAGS) -c gl_smoke.c particle.o: particle.c $(CC) $(CFLAGS) -c particle.c clean: $(RM) *~ particle.o gl_smoke.o gl_smoke globs-0.2.0~svn50/src/benchmarks/GL_smoke/texture.png0000664000175000017500000000203211516033422022011 0ustar takakitakakiPNG  IHDR szzbKGD pHYs  tIME *6LtEXtCommentCreated with The GIMPd%n~IDATXur8D$(RkdZ+GuJJ哤:'T>@7I= AL=. [f?=G~|Ap֚E ,ߒ~rxbc})2BPPK? ™nvt03mG#~M\ 6;B@yCT #include #include #include #include #include "particle.h" #include "../get_options.h" #include "../check_time.h" #ifndef M_PIl #define M_PIl 3.1415926535897932384626433832795029L #endif #define MAX_PARTICLES 2000 /* Number of particles */ int FrameTiming(void); void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar); int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; int quit = 0; const SDL_VideoInfo* info = NULL; int bpp = 0; int flags = 0; Uint32 interval; particle *particles; GLuint tex_num; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; /* ----- OpenGL attribute setting via SDL --------------- */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(opt.width, opt.height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } SDL_WM_SetCaption("GL_smoke by Encelo", NULL); /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* The following function replaces gluPerspective */ perspectiveGL(45.0f, (GLfloat)opt.width/(GLfloat)opt.height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_TEXTURE_2D); /* ----- Particles init --------------- */ particles = particles_alloc(MAX_PARTICLES, "texture.png", &tex_num); particles_init(particles, MAX_PARTICLES); /* ----- Event cycle --------------- */ while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch( event.key.keysym.sym ){ case SDLK_ESCAPE: case SDLK_q: quit = 1; break; case SDLK_F1: SDL_WM_ToggleFullScreen(screen); break; } } } /* Exit after 'opt.time' seconds */ if(check_time(opt.time)) break; interval = FrameTiming(); /* ----- Blitting on the screen --------------- */ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, -1.32f, -3.0f); /* Zoom */ glScalef(0.2f, 0.2f, 0.2f); /* Particle scaling */ particles_simul(particles, MAX_PARTICLES, interval); glBindTexture(GL_TEXTURE_2D, tex_num); particles_draw(particles, MAX_PARTICLES); SDL_GL_SwapBuffers(); /* SDL_Delay(25);*/ /* Decomment this if you want 1/50th screen update */ } /* ----- Quitting --------------- */ particles_dealloc(particles, tex_num); SDL_Quit(); return 0; } /* Calculate frame interval and print FPS each 5s */ int FrameTiming(void) { Uint32 interval; static Uint32 current, last = 0, five = 0, nframes = 0; current = SDL_GetTicks(); nframes++; /* if (current - five > 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } */ interval = current - last; last = current; return interval; } /* Replaces gluPerspective. Sets the frustum to perspective mode. * fovY - Field of vision in degrees in the y direction * aspect - Aspect ratio of the viewport * zNear - The near clipping distance * zFar - The far clipping distance */ void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar) { GLdouble fW, fH; fH = tan( (fovY / 2) / 180 * M_PIl ) * zNear; fW = fH * aspect; glFrustum( -fW, fW, -fH, fH, zNear, zFar ); } globs-0.2.0~svn50/src/benchmarks/GL_smoke/SConscript0000664000175000017500000000060011516033422021614 0ustar takakitakaki# import variables Import('env', 'install_dir') common_src = ['../get_options.c', '../check_time.c'] prog = env.Program('gl_smoke', ['gl_smoke.c', 'particle.c'] + common_src) # Install if install_dir != '': dest = install_dir + '/GL_smoke' data = ['texture.png'] env.Install(dest, 'globs_info.json') env.Install(dest, prog) env.Install(dest, data) env.Alias('install', dest) globs-0.2.0~svn50/src/benchmarks/GL_smoke/texture2.png0000664000175000017500000000246311516033422022103 0ustar takakitakakiPNG  IHDR szzbKGDC pHYs  tIME )c1tEXtCommentCreated with The GIMPd%nIDATXÍ[o[EǷ1v( Jz˓$r{I X4?p~$?JB`5' KI6J5_I:hg SŸuN!Ҏ 81@ I?a #6.:tC5 84E%g{aW@2"s=@,+geiKLT>KIey$ 6`h+jI-(!ΑqR9"% / aMGAhLHzF|nf߇ȈBw&ݱȄ=]nĜE JN4L)unm~ElaNjc~#s֒ϒQ4-FX -[b/0kt,oȔʘDj RJhkqmxCqbCF/; [{#wPQs^",qC۴ }a֒J{AJI9L8ЅP2+,MP6S"#sW݌Bg;kۓ/k n]ObD7,mZZWƷnU_x IENDB`globs-0.2.0~svn50/src/benchmarks/GL_smoke/particle.c0000664000175000017500000000664211516033422021565 0ustar takakitakaki/* GL_smoke: a simple particle engine demo showing white smoke * Copyright (C) 2005 Angelo "Encelo" Theodorou */ #include #include #include #include "particle.h" particle* particles_alloc(int num, char *tex_name, GLuint *tex_num) { particle *particles; SDL_Surface *tex_img; glGenTextures(1, tex_num); particles = (particle *)calloc(num, sizeof(particle)); if(tex_img = (SDL_Surface *) IMG_Load(tex_name)) { glBindTexture(GL_TEXTURE_2D, *tex_num); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_img->w, tex_img->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_img->pixels); SDL_FreeSurface (tex_img); } else printf("Texture not found! Using gray quads.\n"); return particles; } void particles_init(particle* particle, int num) { int i; for(i=0; i < num; i++) { particle[i].active = TRUE; particle[i].life = 1.0f; /* Full life*/ particle[i].fade = ((float)(rand()%100))/25000.0f+0.000077f; /* Random fade speed */ particle[i].size = ((float)(rand()%40))/100.0f+0.6f; /* Random size variation */ particle[i].r = particle[i].g = particle[i].b = ((float)(rand()%20))/100 + 0.1f; /* Shade of gray */ particle[i].x = particle[i].y = particle[i].z = 0.0f; /* Center of the scene */ /* Random speeds */ particle[i].xi = ((float)(rand()%10)-5.0f)*3.5f; /* Small dispersion */ particle[i].yi = ((float)(rand()%10)); /* Nearly no dispersion*/ particle[i].zi = ((float)(rand()%10)-5.0f)*3.5f; /* Small dispersion */ /* Gravity */ particle[i].xg = 0.0f; particle[i].yg = 0.004f; /* A slow ascension */ particle[i].zg = 0.0f; } } void particles_setpos(particle* particle, int num, float x, float y, float z) { int i; for(i=0; i < num; i++) { particle[i].x = x; particle[i].y = y; particle[i].z = z; } } void particles_simul(particle* particle, int num, int interval) { int i; for(i=0; i < num; i++) { /* Position change based on direction speed */ particle[i].x += ((particle[i].xi * (1.0f-particle[i].life))/25000) * interval; /* Greater dispersion for older particles */ particle[i].y += (particle[i].yi/25000) * interval; particle[i].z += ((particle[i].zi * (1.0f-particle[i].life))/25000) * interval; /* Greater dispersion for older particles */ /* Speed change based on gravity */ particle[i].xi += particle[i].xg * interval; particle[i].yi += particle[i].yg * interval; particle[i].zi += particle[i].zg * interval; /* Life reduction based on fade */ particle[i].life -= particle[i].fade * interval; if(particle[i].life < 0) particles_init(&particle[i], 1); } } void particles_draw(particle* particle, int num) { int i; float size; float x, y, z; for(i=0; i < num; i++) { if(particle[i].active == FALSE) continue; x = particle[i].x; y = particle[i].y; z = particle[i].z; size = particle[i].size; glColor4f(particle[i].r, particle[i].g, particle[i].b, particle[i].life); glBegin(GL_TRIANGLE_STRIP); glTexCoord2d(1, 1); glVertex3f(x+(0.5f*size), y+(0.5f*size), z); glTexCoord2d(0, 1); glVertex3f(x-(0.5f*size), y+(0.5f*size), z); glTexCoord2d(1, 0); glVertex3f(x+(0.5f*size), y-(0.5f*size), z); glTexCoord2d(0, 0); glVertex3f(x-(0.5f*size), y-(0.5f*size), z); glEnd(); } } void particles_dealloc(particle* particles, GLuint tex_num) { glDeleteTextures(1, &tex_num); free(particles); } globs-0.2.0~svn50/src/benchmarks/GL_smoke/particle.h0000664000175000017500000000163111516033422021563 0ustar takakitakaki/* GL_smoke: a simple particle engine demo showing white smoke * Copyright (C) 2005 Angelo "Encelo" Theodorou */ #define TRUE 1 #define FALSE 0 typedef struct { int active; /* Should the particle state be updated? */ float life; /* Remaining life 0.0 - 1.0 */ float fade; /* How much life decrease every simulation cycle */ float size; /* Size scaling */ float r, g, b; /* Color 0.0 - 1.0 */ float x, y, z; /* Position */ float xi, yi, zi; /* Speed */ float xg, yg, zg; /* Gravity */ } particle; particle* particles_alloc(int num, char* tex_name, GLuint *tex_num); void particles_init(particle* particle, int num); void particles_setpos(particle* particle, int num, float x, float y, float z); void particles_simul(particle* particle, int num, int interval); void particles_draw(particle* particle, int num); void particles_dealloc(particle* particles, GLuint tex_num); globs-0.2.0~svn50/src/benchmarks/GL_smoke/globs_info.json0000664000175000017500000000042111516033422022617 0ustar takakitakaki{ "info": { "name" : "GL_smoke", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "A simple particle engine demo showing white smoke", "file" : "gl_smoke", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/src/benchmarks/GL_pointz/0000775000175000017500000000000011516033442020015 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/GL_pointz/Makefile0000664000175000017500000000044611516033422021457 0ustar takakitakakiCC = gcc LD = gcc CFLAGS = `sdl-config --cflags` LDFLAGS = `sdl-config --libs` -lGL RM = /bin/rm -f .PHONY: clean all: gl_pointz gl_pointz: gl_pointz.o $(LD) $(LDFLAGS) -o gl_pointz gl_pointz.o gl_pointz.o: gl_pointz.c $(CC) $(CFLAGS) -c gl_pointz.c clean: $(RM) *~ gl_pointz.o gl_pointz globs-0.2.0~svn50/src/benchmarks/GL_pointz/README0000664000175000017500000000100411516033422020666 0ustar takakitakakiGL_pointz: a simple demo showing a waving cube made up of points Copyright (C) 2005 Angelo "Encelo" Theodorou Info ---- This is a one-afternoon little demo I made to have a bit of fun with OpenGL. It is really simple, nevertheless it uses display lists for improved performance. It also shows how to create a clone of gluPerspective() and get rid of GLU dependency. Compiling --------- In order to compile use the included Makefile. Should you have any problem with includes or libs, tweak it to suit your needs. globs-0.2.0~svn50/src/benchmarks/GL_pointz/gl_pointz.c0000664000175000017500000001373611516033422022176 0ustar takakitakaki/* GL_pointz: a simple demo showing a waving cube made up of points Copyright (C) 2005 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "../get_options.h" #include "../check_time.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_PIl # define M_PIl 3.1415926535897932384626433832795029L #endif #define NPOINTS 50 /* Grid density */ #define DISTANCE 0.1f /* Space between points */ #define POINTSIZE 1.0f #define NPLANES 10 /* Number of planes */ #define SIN_ANGLE 0.3f /* Sin waving speed */ #define ROTY 0.05f /* Y axis rotation speed */ int FrameTiming(void); void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar); GLfloat clamp(GLfloat value, GLfloat min, GLfloat max); int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; int quit = 0; const SDL_VideoInfo* info = NULL; int bpp = 0; int flags = 0; Uint32 interval; GLuint Plane; GLfloat angle = 0.0f; GLfloat roty = 0.0f; GLfloat points[NPOINTS][NPOINTS][3]; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; /* ----- OpenGL attribute setting via SDL --------------- */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(opt.width, opt.height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } SDL_WM_SetCaption("GL_pointz by Encelo", NULL); /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* The following function replaces gluPerspective */ perspectiveGL(45.0f, (GLfloat)opt.width/(GLfloat)opt.height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); glPointSize(POINTSIZE); /* ----- Plane init --------------- */ int i, j; for(i=0; i 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } */ interval = current - last; last = current; return interval; } // Replaces gluPerspective. Sets the frustum to perspective mode. // fovY - Field of vision in degrees in the y direction // aspect - Aspect ratio of the viewport // zNear - The near clipping distance // zFar - The far clipping distance void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar) { GLdouble fW, fH; fH = tan( (fovY / 2) / 180 * M_PIl ) * zNear; fW = fH * aspect; glFrustum( -fW, fW, -fH, fH, zNear, zFar ); } /* Clamp a value that is not between min and max */ GLfloat clamp(GLfloat value, GLfloat min, GLfloat max) { if (value > max) return max; else if (value < min) return min; else return value; } globs-0.2.0~svn50/src/benchmarks/GL_pointz/SConscript0000664000175000017500000000050311516033422022023 0ustar takakitakaki# import variables Import('env', 'install_dir') common_src = ['../get_options.c', '../check_time.c'] prog = env.Program('gl_pointz', ['gl_pointz.c'] + common_src) # Install if install_dir != '': dest = install_dir + '/GL_pointz' env.Install(dest, 'globs_info.json') env.Install(dest, prog) env.Alias('install', dest) globs-0.2.0~svn50/src/benchmarks/GL_pointz/globs_info.json0000664000175000017500000000042711516033422023032 0ustar takakitakaki{ "info": { "name" : "GL_pointz", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "A simple demo showing a waving cube made up of points", "file" : "gl_pointz", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/src/benchmarks/check_time.h0000664000175000017500000000003711516033423020353 0ustar takakitakakilong int check_time(int time); globs-0.2.0~svn50/src/benchmarks/check_time.c0000664000175000017500000000101311516033423020341 0ustar takakitakaki#include #include long int check_time(int time) { static struct timeval current, first, interval; static long int nframes = 0; static int first_time = 0; /* first initialization on check_time first run */ if(first_time == 0) { gettimeofday(&first, NULL); first_time = 1; } gettimeofday(¤t, NULL); nframes++; timersub(¤t, &first, &interval); if (interval.tv_sec >= time) { printf("fps = %.1f\n", (float)nframes/(float)time); return nframes; } else return 0l; } globs-0.2.0~svn50/src/benchmarks/get_options.h0000664000175000017500000000075711516033423020623 0ustar takakitakaki#ifndef GET_OPTIONS_H #define GET_OPTIONS_H typedef enum {OPT_FALSE=0, OPT_TRUE} boolean; typedef enum {UNKNOWN_ERR=-2, NOVALUE_ERR=-1, NO_ERR=0} error_cond; typedef struct options_s { boolean fullscreen; /* Fullscreen flag */ int width; /* Screen's width*/ int height; /* Screen's height */ int time; /* Bnechmark running time */ } options; #endif #define DEFAULT_WIDTH 640 #define DEFAULT_HEIGHT 480 #define DEFAULT_TIME 5 error_cond get_options(int argc, char **argv, options *opt); globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/0000775000175000017500000000000011516033442020535 5ustar takakitakakiglobs-0.2.0~svn50/src/benchmarks/GLSL_parallax/Makefile0000664000175000017500000000107711516033422022200 0ustar takakitakakiCC = gcc LD = gcc CFLAGS = `sdl-config --cflags` -I/usr/X11R6/include LDFLAGS = `sdl-config --libs` -lGL -L/usr/X11R6/lib -lSDL_image RM = /bin/rm -f .PHONY: clean all: glsl_parallax glsl_parallax: main.o init.o textfile.o extra.o $(LD) $(LDFLAGS) -o glsl_parallax main.o init.o textfile.o extra.o main.o: main.c $(CC) $(CFLAGS) -c main.c init.o: init.h init.c $(CC) $(CFLAGS) -c init.c textfile.o: textfile.h textfile.c $(CC) $(CFLAGS) -c textfile.c extra.o: extra.h extra.c $(CC) $(CFLAGS) -c extra.c clean: $(RM) *~ init.o textfile.o extra.o main.o glsl_parallax globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/README0000664000175000017500000000222311516033422021412 0ustar takakitakakiGL_parallax: Parallax mapping with GLSL shaders Copyright (C) 2007 Angelo "Encelo" Theodorou Info ---- About ten days of hard studying were needed for the development of this demo. The rotating cube shows parallax mapping with offset limiting and normal mapping, while the environment is lit per pixel using the Blinn-Phong lighting with Phong shading and specular mapping. The normal map is encoded in tangent space while the height map for parallax mapping is encoded in its alpha channel, tangent vectors are sent via gl_MultiTexCoord3, I didn't managed to use vertex attributes. The textures subject is again Blender's mascotte Suzanne. :) This demo REQUIRES OpenGL2 for the use of core functions for GLSL shaders and Vertex Buffer Objects. The GL O.B.S. edition of this benchmark doesn't provide, of course, any control to enable or disable features, you have to run it at maximum detail. :) Compiling --------- In order to compile use the included Makefile. Should you have any problem with includes or libs, tweak it to suit your needs. Notes ----- I'm not sure about the correctness of lighting calculations, it is not perfect and shows some artifacts. globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/textfile.h0000664000175000017500000000054311516033422022532 0ustar takakitakaki// textfile.h: interface for reading and writing text files // www.lighthouse3d.com // // You may use these functions freely. // they are provided as is, and no warranties, either implicit, // or explicit are given ////////////////////////////////////////////////////////////////////// char *textFileRead(char *fn); int textFileWrite(char *fn, char *s); globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/main.c0000664000175000017500000001035611516033422021630 0ustar takakitakaki/* GLSL_parallax: Parallax mapping with GLSL shaders Copyright (C) 2007 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "init.h" #include "extra.h" #include "../get_options.h" #include "../check_time.h" int main(int argc, char **argv) { options opt; SDL_Surface *screen; SDL_Event event; const SDL_VideoInfo* info = NULL; int bpp = 0; int flags = 0; const GLubyte* string; GLint value; struct Material m = { {0.6, 0.6, 0.6, 1.0}, {0.3, 0.3, 0.3, 1.0}, {100.0} }; struct Light l = { {0.2, 0.2, 0.2, 1.0}, {1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}, {0.0, 0.75, 1.5, 1.0}, }; struct Shader sh; GLuint texid[4]; GLuint vboid[4]; int quit = 0; Uint32 interval; GLfloat angleLight = 0.0f; GLfloat angleCube = 0.0f; /* ----- Gathering options -------- */ get_options(argc, argv, &opt); /* ----- SDL init --------------- */ if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Video initialization failed: %s\n", SDL_GetError()); exit(-1); } atexit(SDL_Quit); info = SDL_GetVideoInfo(); bpp = info->vfmt->BitsPerPixel; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (opt.fullscreen == OPT_TRUE) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; /* ----- Setting up the screen surface --------------- */ if((screen = SDL_SetVideoMode(opt.width, opt.height, bpp, flags)) == 0) { fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError()); exit(-1); } SDL_WM_SetCaption("GLSL_parallax by Encelo", NULL); /* ----- Checking for OpenGL 2 --------------- */ string = glGetString(GL_VERSION); if (string[0] != '2') { printf("OpenGL 2 not supported!\n"); exit(-1); } /* ----- OpenGL init --------------- */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* The following function replaces gluPerspective */ perspectiveGL(45.0f, (GLfloat)opt.width/(GLfloat)opt.height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_DEPTH_TEST); InitLighting(&l, &m); InitShaders(&sh); InitTextures(texid); InitVBOs(vboid); glActiveTexture(GL_TEXTURE1); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE2); glDisable(GL_TEXTURE_2D); /* ----- Event cycle --------------- */ while (!quit) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: quit = 1; break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_q: quit = 1; break; } break; } } /* Exit after 'opt.time' seconds */ if(check_time(opt.time)) break; interval = FrameTiming(); /* ----- Blitting on the screen --------------- */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); angleCube += 0.1f * interval; angleLight += 0.001 * interval; l.position[0] = sinf(angleLight) * 1.0f; l.position[1] = sinf(angleLight) * 1.0f; glLoadIdentity(); glTranslatef(0.0f, 0.0f, -6.0f); glRotatef(15.0f, 1.0f, 0.0f, 0.0f); glUseProgram(NULL); UpdateLight(&l); glUseProgram(sh.p); glRotatef(angleCube, 0.0f, 1.0f, 0.0f); DrawCube(vboid); SDL_GL_SwapBuffers(); /*SDL_Delay(10); */ /* Decomment this if you want 1/50th screen update */ } /* ----- Quitting --------------- */ glDeleteBuffers(4, vboid); glDeleteTextures(4, texid); glDetachShader(sh.p, sh.v); glDetachShader(sh.p, sh.f); glDeleteShader(sh.v); glDeleteShader(sh.f); glDeleteProgram(sh.p); SDL_Quit(); return 0; } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/textfile.c0000664000175000017500000000210411516033422022520 0ustar takakitakaki// textfile.cpp // // simple reading and writing for text files // // www.lighthouse3d.com // // You may use these functions freely. // they are provided as is, and no warranties, either implicit, // or explicit are given ////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include char *textFileRead(char *fn) { FILE *fp; char *content = NULL; int f,count; f = open(fn, O_RDONLY); count = lseek(f, 0, SEEK_END); close(f); if (fn != NULL) { fp = fopen(fn,"rt"); if (fp != NULL) { if (count > 0) { content = (char *)malloc(sizeof(char) * (count+1)); count = fread(content,sizeof(char),count,fp); content[count] = '\0'; } fclose(fp); } } return content; } int textFileWrite(char *fn, char *s) { FILE *fp; int status = 0; if (fn != NULL) { fp = fopen(fn,"w"); if (fp != NULL) { if (fwrite(s,sizeof(char),strlen(s),fp) == strlen(s)) status = 1; fclose(fp); } } return(status); } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/glossmap.png0000664000175000017500000001455311516033422023076 0ustar takakitakakiPNG  IHDR?1bKGD pHYs  tIME3U?IDATxKlgN8vW QPZ$@( eXVVtT Z WhBФ y4}$Mo翸^]x&Ϣrv9{M`b%cqX̣>/BYֆP%=@{...&?3*2ִ!' Ƕm۪!2@eǎV7LӧOHAf+?oAe Ȉ ;9J P$7nljjҷ1^ ĐK{> Ls8ב) 8F>r8q*nЂll>5:( ZN>A7(<˶ELҥK~a `_\\|gΜ!\.ȏ4L(4}ٳg^eA߸q>#v$IÇ=Csss# a9>WgϞT*_r}~_tJU@ t:iTI$Ź#G sϞ=Kyfccpxrrc lݺ5jZ!?ysɲN[h&[?!\v} 'yfOx<ͅч6+O➄0(&g+%4OIXK%SgIУ $=hT,[Η WYvuź:M twwl6;kjZ\ eGO]w5;;[;wn~~^5' @g׮]@  {c=L&:| MOOI(ZYY+LGѣvZ5`3}Mرc.P0hk.\frXe,H;WV,*aÆ@ zn ϛ[llihhLjv yJ.JP9_] FK,j\.ohhhjjjkkkoosssU] Bv]lVQd2Jd2L$+++x˔®f9H?1sLTvֺ\.r\.WMMnldI]nо&R dzaC| LGf2t:055EK @MxM8;c(xjq2|֭ s2l6IbHd5tj$)L^~}bb"z,//s"e)Kfffj@K@)ٜ t4z׭[xp p͋/V$֯_O=q kFgff._u飯}vjOgؔ|qEݻwJY?/ Kt1~iwwwwvvz<YE7)2^A&'Mt:4>;"QnY奥%O>>vƍl/b}$)5Z?o]]]/_'lڴC7(q.al9\"H `EєՃnzͭ,/,,Ȳ|wţ$I.K\*޾}{&)kcGGGI$ccclkpq\^ut dlVg]dAl(Ip6Ngss-[mzcq$)o5Ўh_kķD6m=m۶e˖灵fͱcPcL jGG&9 I,46ܜAe <OKK˭[/{\]6l;~}}֭[Ip5?iX\\r6liBx1R%AχŠ;eyݚRtttpzr븚#%Z?}q֭[)Т'K`Yc1TӝPHZ Y;w,c:{܌MxDB2kLVVU fCE~WZ! ٳQ4+fÔg}vS4bT;vXg]f!6abhh&?by.UUnw(& FXL~H喽4 j@FЪY@d-F"} F ٳ's;RM dCCC,ZhNy0+h\.EQ .nj.KqIzwi^>2E&r\dr޽ fΟ?cǎYfYSsKݻlss\ 3??oV[d`v>[\Y{Ed2rkN)ql:nW_-żt~:00`q\L&ú-bLFbۈNMo[4 V$\MQ,nj. C"wpas .HvKk ESX!6ɱN_GlՈW \07x'L}p^^LzЬ "}i"Nӭw 'IW Ō_,kj&vdG./Ko߾}ItС:֞eY>pc/Y׼ܓtM~,Hspd&`%&=Hp*ש pɢX4@#Y|)GǠ˲石?}׬hs=e) Wb>$Hh4N7{z#q Xz뭢K.uuu6UUsE-ĝnygtM>u|8XXk٬e",//͏Ȑ?ߔҒ垬?#fX/;;;SjhFrHsEf`bX*b{E3%KIqnw1zzzJjZ8d2NSϤ3F: ɏ(EQ,>#Rb1ęf#p8TE'ǯjΥ1.:srUU{2*ɲL ND"a X`,2 Wܤ6WfyT*E]D" %ILaRF2Zwtc$@(+菠>$w/*$I###lMHp8N'+$>l\4N(*Ɉz{{&hkk#mɚ%8n6nYާThDŮ_.˲r:_ĜG$1쓚Mfmollf+@ m]m6Y['|ѳS;hkE^zh4Zӡ+vgYgffFFF_(1Nyf=T* x `Sġ]8f'џ&t4?Jݸqctttff3q+X͛7cXMMҜ@-}kX Iɓ'GGG~7n*%Z.p8H-p]MOÂ( ?Zj(jii|M 1ވ  PwhpѠƳ\ΟYWWǝlN6`_@bH4zt VL$!wYh+6GPU|>P2#v4caˬDoeI$׮]2ذ@ieF4@u_ӭ0"2m2nRi8= OFLf/>Jz%&@^/%kmm}GYiLȭ 檳/2Ɉ~\!xFw3̌MMMA9PTwwwWWWGGGSSNE3E+~) -~ʕ+UwPT},/..NLLLMM)C[!mvKԲJ/~Q199yɑU C~Ϝ9cPQ.]V?l344488\03:u_-.ŕظaӿrdn>uTkkk <]o$zԩaX?P..\?655ʖ-[߼믿0F%(4?@NJho@V033sĉ;wwM_~֡ĉ-R2;;W_qc2S#jkk?*W_}%8yx #~ܩeCt:}q+o*Jpd2ׯG"nN!]IL?(v48D7&쌏;͕JroS `(`0(>,R`K/"@k3; ={p jgE.8s s" yp ̌Y 5PI 0xaX9wö`>7oΛ Bp 0.0) { gl_FragColor += att * (diffuse * NdotL); halfV = normalize(lightDir + ecPos); NdotHV = max(dot(nor, halfV), 0.0); vec4 spec = att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV, gl_FrontMaterial.shininess); spec *= glossMap; // specular mapping gl_FragColor += spec; } gl_FragColor *= colorMap; } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/colormap.png0000664000175000017500000006122411516033422023062 0ustar takakitakakiPNG  IHDR?1bKGD pHYs  tIME X IDATxwu'vι~~{` ,RHQ)$*Q*גV9Tr(ﮭݵU[vy^ْvURH%H0DN't|PP .~ǡJ^B%@%T TRJ*TRIJ*PI%*@%T TRJ*TRIJ*PI%*@%T TRJ*TRIJ*PI%*@%T TRJ*TRIJ*PI%*@%T TRJ*TRIJ*PI%*@%T TRJ*TRIJ*PI%*@%T T T]]MD$ը*SW_բ~ rΉ"xEQ ޖѱq-E 0S{/av3[,lò(2gm4bDJݭ gK@Z-,\=zsJ*=r4쯟 )8?C/DqkZKkO=Ƕ,03 H9wo{ްzHV)(ID(=9DDDU(YkܺҕeKN;[lm|募޼V:Dh~qy1Y+MJyʘ7E;6oFI,vȘ8bD&2:n/TenvjF='?EYoyϜx4yN>i9 Q$h)m/"T$"aoTjw/noGCmLqhϞ,,/GѰh4Y='5mV//W__8ٜכq=Ν9%µzٚKk(1QY\g@!(Z!"!@^1B)HiSr:֚/x1F$"" ҆&IK+m+ksˇ|Gu+dkW>7.]8S93 x< ?"j{Hd 5k:5$a]hrV$Q浚VMB3FfeYቐV͹z{mȼ+h P 1)w~UЗ>3"f-V`4! LBRoXX/ebê;/>G"h(2Ib)*Dx=b1zzy{uŠ^EWz5vMkV६֟ȯO>:yN ҈BH==@"cZ^|3X+BEvDw…  YB.u"D UhYKYVxDt{n_]yV9JVHJk$ y_2^(bcs s{5W(9xg7K[1 dxd~q7; K UTlo_ޭo_@v/diZ6_Oj Yk$zPIb(!R q Ԋ*;}t".\Aps=5#pۙ~'/kU* '|4h?!,w4уe?DTU9v`>10z, )$n?9Li4:hLJW*xy9v5S\ IƪՈ{.ηz[5З8Gom%RUC{_z!\㈘Yڝƹjge/ڡ;.\(z/̑X8tgtb1qi<:رrGktnƅCE_xKdIZ|Έ_xj<y6$o8֑[yi0jfaWuڤoGQp-8~O6MDex@&zNjcq?Wh5x:"Ȁ"LB*8j.")2_+- sЊ`7+j +=s7.;Zͫ8j@ek'F$ﴢVJ|4k:=:r$͉" Kvm [vى:@&IO " LV2iȽ9I"4z;˲FlGaiy8J+a4HhG(JU Zv6.H1{XhilX-ֵ_7DHDFyzA4Fp8tlE&oDP&v@S՟7Bx `$0--[W,LMH؆Lz4PěT}\԰3Z!/3V q戈3'ac7Q\W(_}cO<~DM5լif羰\nDeܵZ vo^Zs'Hic޻{FymRZGpǹݾ`xge՜ "!A)"N8b԰{ς tHDqGvcm'gE&`e xWDQ sG?6JfWveVݬ-y79"y/lsYֳO=e0P,͚Jn"T.7@j 7*y;4N#ү7N0,؁[YS:AFXX Px`@R/:2Qf+SKҸĉtۑݷte>4Z iM7K8;dھ7ƕwl3;(/ynYsj+9`?zY ٹfIkUYM倹 7~@@f1mloY Rz9>>uk=Y-7wA1̼cӹ8͚5upEXD]0a1t>NIijȬ'jY?u;O^=p~#;_.6V/YI{C|-}YDBn@"t6vr04SX)E͚zRJDk{dn~ټ_` kA0(2j{'YrkN1 dg|w{;ND{~ӣMyh쬛cK bYkLK#jd@& p3W[/no0(J+Z4C;\h9l8aIj#"v}|yk\£߱q F6un{6 +kEЬn(-Ǿŋ?/z*|/G?ӏv|e>O_DJcVxc)T<`ڶ@wƟ}R.Q,<*Q[Oo]mGQ6m14q@ ;C vtFѻ2텍q7?3h#yeOlZEB}yZb[/<՛woBoOpMǑ ~aWLWW Blh"v*|/Н"ۛ|䫧O=3c"'ZgKpt(:n[K7ma! G`;*=-GYi=ˬ9hs/'V nFv"8aW 4/\×ƥgޯoY;[gT<}/h"ݼprn*!6;yi;+J%W`@R'1Zf7e׿w"WFÁNlwgAVꑡ\H"Q*/ywE6ao;w#Ei.3W` qyYdimQBF">&U?^:KVN37DD͕o[xs/O}-¥|_Iڱuo|ұ;*uOı#uGk2ߌlGw߼477Wk}Dv= j=/=97e6̬DZE'7lhy.eIT& %Z!8m+s$J7{kݸǛO?pOo]^@QyﭳU= f =:_ZJ: +6:['N9[ 'ḱni?x2pvM1#3?ܵ^^(_}|wR`B">8+DO@Ү\|A~!!P-֣ML&B|ۼ6z;#Qx9G7wzURެIƅ_:ID H-UuϱЁCwon4V:z MZkwDXR\+Z[Z/uj˝ti.Yoki~=KA./֔ֈ ='c("| ϟhG,ˀ4uSJCs_YEs$V$ؕqڎ;ާEv% 89}.#3\xy<>0.]ZћhOV(/6!$iLIK漰4y9|SEf|?LH+qG@Dn>(Zz|3+I>P/һ=z*4lҹO×ɲlf - +ZM[J 30X,,bd(fԜ3q͕E*1qbN{μ0rNR;g'^]]D;%Jz\Jk*iqm]pt3iɯ-2xfa%($j| to!M63TF#qך Ą XB(wgO~;I\ ^»[:DBfB`x $aX< jM̳ѐkM$|iڒ!mV%}Ź+G,_n[o?ٸ|f?W)7WdWҀMQmZ8> BDvO,=RQ8i/ēsDXX') "\0#sD~Ƿr zf3?so-7Ӧ 30Qmn8u~G7S3^sSoX=d E'*¤:kiPg'a+ a"6 *!E\f}`⎳YXu:DvuR{WO*_?ZoW5WC#aϾ`\I!#ZkzIt"PX>QGe6wGRJ& `2BH81'>O1pxVx+Cb{#`鿻y`? <8wOv]]l8pNBIۓznk`^/:EL,1  A9DEֻ: 6qDJi#SO:n8=sqOl7[vL by-BĸFI8HT@f湲,jo׎xv"B Äz@_\X·7J,AO~MG2%R t^¬"6[w,aNlc盉|~cD}w@+2I$ /ϭ P1&2tshc&-DE41j̴I%oySESN6ma%#7{'v IDAT{ee5N4.<_?Y&lC&?l" ?cѭSgri6Lˣ_.\{vZ5hű6&D( A)+I} {ЛV|ɮ`*!D'y( "ѽ.lvctyԅVwtωFgnw-'Omo=:RJ%IҨuc7[k죦`71X} R0U@mJس}-xJi)]dg/m .mki + N^5 {e'w+D:5fbaG(z1]Z?)vD(&n\`ZMͱo]~O_*,\^O(QZ0LIGQE \; ֆFvRw5It 3] xJ^/?{TG֙f_3] "B\/ĝGV,L!f0Q $V'žb#2 g~$;"!u) {@$"E*Mwʲ~ac/-jE"ltpըZI"Qdl)މGe;޳lCIyQ{&&_h#9~:22=XY,?c3zReo>xx>( !@')N'2ۄ JkaI)EFkb #ޣ"eV37(Ks؞q6/[g0dvy^`(PB2yO,}^Li x{q%Ȍ&Ddrq." V-fO<\sq~шBP(+\e)qr( ( '޲<\7,f!" -Fo=! ozߴvx?f N:vTlUom']M M(X+Eғ#6 2?MȩE7fK%쀽V ރg)ꐷ(R(DQ@gpv+Fr| ̢Q A)%DHAm(K^n>yx+<źjCF!xWL^<<V4ќh)M;_ǷF+"~븰\~{rZcqv5^!>}.sϮN")BF$( s ?wfa曺\M"Ņzz OkBRdG EA!,G^5MlRZ-֣}DH"BZͶAAҔF6}txιd=Ԏd۴ؘ˴J&%@J)FxF,3_ln!i "n\X;8wݷ7CrݸJ5EͥbDZk5"EDzzf^2mr;)p֋\:vC.ૐ30+hY$$PFqO.#@Jݩbc!GDgajA8FDBA&UZr牅'|CĈ"6w:v@H , ,HF%#(a⹥Cw3dK(NߧLki^kO6\>C5W," yB7ᄍ fY;3.pIN $ f1(yδ,(%iynnx z;DM-6qkf,t&i3O<T ˒_sbY\ޅWcrsC4qH9#%d&I`֐o3+ 4 Wsg/@sڮ +H(Pd—u.?Wk2wbġZERJkcx:JRgJ-ع@,DYŨhqgNx3±^|ׅVj@.s Zzs:AD EB!םJnfͿuhJ*\{b6PkCu"Q(6&"".GYX*˲Q3y!y}Ǒ|:gY!\g/0@' Ƨ~v|@O#<3"7p4 9l!ww7ڂع;wZ5D&1QlJ,@Ik$,❝A`8>62kZ&@#q*@\ Qfn8_KOc]zYhFPKg)ãd NE(kw^GLi"mc{|q;zऑrV(êF|}7?j'ߴbJ[ncVl՝)  gAzー:Az@U\w8ʄM;]h,}Rw3/\˃Xi6qtd(NL+R@`d}k&z"yjИ;TyQx ԩfK35U7^Fq1 3hf@ZDTU<@>řS $id[;Z न$thc DHѳٲ~~yknֶ{{zh-.򾰛ɐiT4~+΍+ o_a[|>k=7)>We,*CRZy鋷_]hc1JP%^ygE1 ^F|uBMΩ7@+Y/.] t7΅>"p=. G-fy'$:0 }'%Luvg,7 bJXt~6zHaFd_+$9ཎl$QcA;1üpyኢuĴ[-~  2(`Lİ94:;2h<+؏KP:BL &ϒ}nz%aR9[ea,|oKmQO؛+<;r]G}c(l\ݧ/{W!;Bqvq '7 冥f6Li B~lՏ@ !T׻t 4죩(NhmCgfy7 lZh+a8{M{Y / (J +8dy"T.GdN 4_"LDގɎQm=xg\|-ִ:P"ཱུeIBARJ@03 ƒ$,wx;ڨѸi6r8F OM wN[‘@DB4TDKiwѤƶ\fY.!)?Ƒ]6h)lDQi`=x=/|ٍtz֣ pFڛubicPьm +"ĻeՀqא ޹d(93KsuV읳%L"E'.,њ) DhxHL'yLxª6 b`k"~ Z&qBT02 4ʲH|-&,LCȤiarżsB pTlvǣܧI=o=n^ܟ$t]B&}Q!3%@%0)+/P\,ͧ& <8ae) _F=3TDJZmt^ӌW wαw2k^bP)ޱ&r 1 P0+O^u0B0Z NDD*cbGj юkS <פes%{/ϞYY'_0N/姯5/~U02 ,A;^V<&PԚɒk> 0|ae:qH_w#S:ElP 1hVvdV FTX ZQh ̶v{% lv*4]aUNeWзHtE'Eq\iÁ;,{,"왻?x^ѺtCo?k\ysF*7Hb$;|O?BQDZuLJHɤ ^y4຦5:r۰tQ>#JvwqYR:8N(RDHM 쓤juVFTXB(z5".o<{3: A) dN.RP׳*Jּ=6$^‰3^mfg/å w|O\ ;g{:U00II@]YtxN C*0K5_ܰxmabܝ?ls#gهPkՍV&EJic(N6lY:Q&񶈢YXzf'}M[ iG_dSߋ&+'  !N^"Ͷ61Dgm8ʆE:}$$*o9I۪ן{g(b'!^MK&g4F~$Nڭ;_o V4jbÂ|cFu3B͕[ ҿo=ۗntǥ TZc($MZmK-Z{3 uzTZC ȑI0%q#1SIH*@AHQaHH*ppa˲-ؖ-cINL70~e:%?:/ SoYMt *|3歚^i4ZV+RD sΏ ˟3,?L?Tx<,`c/YjmmFNFɱPv:[n7•ȿ4}];CP#X!9^,h< ųߤ.4m-,(R9ZiU"9zë=m-I\¨0;I' BLF訤~ǓcSNɴ\Ӥq]VL}[DDّ6 Wv6҆]N0.g]em\e돫#V>GN"L1S{;ZUŽx똽hje&1n/ D2:,^nxi4j_2qt߻}}dU+^!_cpUim6xѨfPaV: J[65?!cC/\Xo鶲#޻@qbv%ցG W} N{RȇnlLp*ΖOuy3li"e 8$ gwp4>}n/{cY~stW84mآ\s'wYq^cDi63JԿQx"̺ۻZ^"ڠPu@ b<{ 1n ގ{'3;U[[_|ŵzBN=s¿~̽{,{$aiH  z܏'LTf BuyiyW(.ki֡D+esO̼c gV?gzLoDW?z{w@u0FφKv,f"妑gyBF1 M<`!fdAԙgoR2T0%LW^{")]6ucJ;Hdx"~XDuF+Y^-w=-*R!$ԤIL c`}U x {kϰ D=Z IDATO_2b|J=jEFQ==IiJL{DJ&fŸXN^}O=R9,q#4ܨR WsWp_L0 xmĘ$Q̤41M1" z!կ?rx^.DFP ъrc9ǂ8ʉ@멜Tͮ 7Zg+ԉ鬽0?{3'. m=ggo?o!OQ)e$I3UYx@"BcxzΒQhұ ĠUA Z|=,4k/@D"aLv,ٳe#Be5>wv3<Ʉ<#As~jm:mYӖN[NR ƠGg6RccznHܘ$XeޏGE9R2"Ԏ@",=H!ɲf&rW)!TUUs~\>78xHEKh}ouB3e(A0XxTzBgZ״ <Ih .fxa0Ew|CRдǾ2B9RGDT3_1ɻ-#}'Caf}yݛfgg&xDvuxIUCDPa*/2:Gg]5xK& ϗ|wL u<AU*RƖr'8:7s} ^uΫ6g|CRJJk:l"qǛ:SO]tTʤY9ıw AOh8a\(Ӡ"l- ɽ+Et5$M$B=* l3K}.J%Jէ qQ JOvz!_ϐB^C}Z;l1^gE|Hszt/ϳ@#׊DJcwݞMjqV+R9}Y,riymenHB\UYYct%#$3׌EiJ5FˏWeQr8nɇ-f[-j &Gl&_8y2%LӜ?2sb}$֎s5b_ xH!/@f9t|/܃'aj"rRQwfw,-rX8gK$՝Ο>sT;OV3U1^ (Of\'yHmRLDR9e;G- J;on{2mH D'*ɧ=6*$ 8RƳw6.^8]i4InҬ՝|>٣h؞٬M:ј17Y^+\ʡK ;MlO HYצ iCBL/Hu—}ïqAkdJJoަt:ɒ4OV5ZQ!;a=7$vt5J~w?7sX RIۋj^1.eOP J6H& g<ڽs x d$- z+g.=FDsŸ HB hܩŨ%I \tHZJ5s2;+?rn<9afHM7R {Ji5$96PTU@42STU}HiVn6U>~[xC'o2p4Bxoqǹ`\]f盁Y45#R3mjyѺlmYwΕnhDyݯKτӦ+a;d"1(TIgхj0x+ $^ny 8"MgFY5)mVҜ*D"sjtJ" \>ԡsxJ@MRٜn.w+~!FD4P᪕riT2Aiinfa~iijVZiibZym7,! &P67/WUad*.G + T*Hvx[3nݫ- mCEҊ!Qʉtjr0,eG>7 |K~1YjZM>1_[W߽Ej{k#!H)2"=-0 %R7]^*ifm4P#^\f5Lxzԟ'y#yM\i*'"OmEj,6z_?]DXo76wy{~cS3N޸e떸"1(?|pm?Ggߎ4Q[I{A@)x}^m%I)1ZDvm#EQz:I/|on߱#.J +{ò,|,tEY0xA NkzTg :@,0N`=(wŧ;u~>sԅ?˿+qQ3(b8Ŷ͝7ܺRyF{^`dSrN\5 +lvXTI0h4}(1~UUUU17^$3 6( lPAnI iBwϷPlx\\x\!|RAz5Ds@ju{WaZ ߊwz+vͶ38sL/˒KJ9=65 >H(D)U[w P΃r\V,VZR 6 jyj*S8rpL_i6 ݪN@psP Ã^'EYL_f;cfDb_G65xp ps"OEA)=`Z7X<ϝsEQ0sU|L<.'zɪzCW+oǜs{_["0{a̎/"u6yHiMJH"ʢ* g+Ov;Çpyzai D ~qt>?ʄ&l2Ix;Dl-ڲ" )eD<)B RJ2HD)x"xy`w(n+NN$Q [Uι`0}9rۯρ~ -,&Q:affIJ@F$Q@F"L 읳, f C~:x py,̼Q, D %6^`RU6IL Qj<GQe333cUPA/Eu7dg;v^j$Lkc >w- sV%L W'e"oy<ÃO[ߚvQ> :Bv,c˲Hnwܾ0f1p8kġ 2 b\v4ˍ/#K'?㭻b6!U;Ԝ>svee9!DžM;;UJHw9uVevEy3våˠ1.+N8!"ZKȇ#;?c+2W޳}N;plAvkvffDs6عjyuh?ҧt^\RbfDǔiԊb܈hnnzՉ)eDž}_W~,VVV,CU1-QeR D$FHH" ^z։_։Zk .5Ƙݻwuwĥ;@|]UO?h8ZgYfafT$! JC rz^ٰ7M"jZnwOg Rsssn*K +n{7ͣ5ƈx<Vl64 #c|K=H7l!H 5MD;&km8aP)n??pCLc~~!,c":ut'( IDATfd}ZD?7)S+>"5t7Z?O(xӝw޽ԩeY2s]-J<,4M4|T'l!~B;w=&"/=:vO=}sW/,-9H"R<'I2ʲ Dh,-{F@"fyƞ˲-[O}w|c|=>jUE1Fomh]mmu$Irh6#'@D; ""@DD 1""bDD ""@DD 1""bDD ""@DD 1""bDD ""@DD 1""bDD ""@DD 1""bDD ""@DD 1""bDD ""@DD 1""bDDQd&jIENDB`globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/parallaxmap.png0000664000175000017500000010106311516033422023544 0ustar takakitakakiPNG  IHDR\rfbKGD pHYs  tIME-k IDATxegzbfT z%D1(P vg(-6rͷ6۝b3VŨ_iկI Q<htKy, E$ y/ ;eHfU1:!PH<!1pU8TB{Q FYH&Fg`P6Q:P +YolofӰ̵Xh9,B=8Xv O!qbCאָ$t!.bŲԉ#BH(葺"NZ>% &Q0FwaV$LM̌A4q:N*+F!ߞ|{ݿ~oD*~otR-=)}R5/GBpfkVS&m9j5 .;(.ճ0`& hLFS'gqdxοUӉ@'?/O?~oֽbGžFG, >-~#Wr\$z&< 51"elt0?|W%0o}:4ѓ/ͯ?:kv92%4ٯn=f hOhNd e\; Z{=kBG)kQr?i|οϊW.@'&ɿx_kuj;RĦYDeowl-0\I%^m U`0ْV ;{K1kEn|~ӻ?N:3E||oۿo7ۖ 0cXGPZkMVKk$lr*?6-ͭbŶ`}7pIxnMVV̌==zUn ԈPA?:xy'<t%w7~o|kM췤_#$oiK\r.6X[W]_&]~kKhÎkW`ؕ0rPG*%xs4ߝ'߿Wg(vkcZ ^zL[A05[y5O签\*f`̫מ# \}̜a4MYtoM}i'dWurV?LDGzB4~<,ZJV6ףuH,lb{+יx>x$sO~ k^_yϓ61 ьb; _{[po_~K K~o͓qc:i)&\epeݯ', 6q˄q$tφ`+MVD5/-*twؒ] ygڏh9_Xu~'ʖ:xl7n}['~M5+<ɫZq\U4Ҥl$W%>k_^k! tk9o16Җ{jV Z{y0'x׿Yw둙N:xa4||Mbg(AED Y,_y=/eq$e"^a4 ؕ:ه pI|nS!si76 ]𹇿H(UT\\oXE62 f886/Fn}򷎏~龙Du4o~lׁo("b.IU]rv_ JK|㳃؅8QB@-A60s]Z[l- KO`lҳIkce# Ky4ejE4e$%|R$_X!suwͰ&Eカ4DEiQhXؠF&sh=\ˮ}6֜qtBy+Kw_;_GNo$NR@Y^\^F@|W$t:@p5CV$=-YM/?}/ݧ@Vrs-ǵx+nt[A E5`$z"~o('ZLm2p*)4gf=oa/1vレ~zOw^7I $/1~3U.܌[1Er_[@]:ƫ,{OLvbT7rT!lF#5+0 3yD@SK"Ql,J A;((,@D5ne<|rFizg]N?q '߽_op#vEĵ!*? Ri?;MrqCkK^\@# Р ˡv YoURV\W<@?E{{A!{YD`pT1 Sdi/_ت b(˚B p uNm; IW7{>L \%G[q7~ p_&*_W?d TNM!&Y|:73 Hh#și\NjP OF,BuH D kT|£"H]nҳ"`z`(A+/dcj>怵mO4^+ ħQV^$K=ݺsK{O^D`'~?>9o_BEa?_0 q*B- @ 8hܑkul6U?[/`E|mtH"w,/dEϾ{G]r?yz;͇7=ba?"ݒԭ'U_r=eX*^l6ٵ X;)oϷ0UBkT Ԭ ^o-dw!Wbϔ f4G|ܻ2ܤ_l07 "eWamX  4I?y9/`llӠjk[Hh3Ph17?z=uu/{]A_ʌ~ӗ94AMZnjJ/"O~ Ic )%H3c\x- XW.l'#lHx~֯~sv_s'x(?ޯbV${ov:}֖ڵjآ_| ͖U;oH<ۑx!q>LY1av+˅[ *#' C9`TžD7ԽR)LHr5; B!Qoш-rW1* .׵ög0JGXE }Hz=_{wU\d3׫k%ee@`)"O[`9!<}4H`Y]~;J?M/H[.z wjKo.h~ 77%J2ۖd6xcT*rw/Wk"hKH՞Y7 jAf0 f0rG BDFTű7a\C (, ICJ`*`)co@L]01ҙ ۀ V-E\%eJh-"E[`1\]d&gZҳ3C뇗\BkHI @'06h%֮c]}sPg5F˭ }|O6نD@O4LNKBå76;I#/"ɏ? C'P/gn*RV30,T ;Mp#- 7{f[7%"=u?'h@#o 0kie* ?y{oa6!D3N}~>L,*CQ`TTˁhJ'ţhhV~~I^Q0*k/@%z^jS6EH$cF-H{h[⋁|Oх+اeOa}9 QOO,m<ׯ'Jia*Up"W@71P6;V-vEفَDaKEL_z Z^׬u} 34XjeU(+;rxpy,,L`s7{ɼT 5{,ʞq>Q*S4s97OpoBXZ-w.吿? 4P "zZmBp0=vedziLN 饚Gh hL(9q r>2ZO5z<6׾ā*:WMItfNE4(#AS>5㶖[.l_tW&@h/|lՒ#d5'{huO;/  ZmUՠJ. AnLxk瘰[U 1X*Tu=H^78In׾~»$\fٍ/Dx{[G_'oVIbPBfnt\D^"jڛDT>wt|&M kϹz;.eK7ݑh-|(QK|F1b-WV֟$Dъ?e|{܆ր ( eUs+{GF,Y7z>VNFeEI,Λ3oi`ܤǯ1& dk멘B\Ѫ׈q}aZ{h) GX$}~쁽>TlHj74APAPXb@&Vz>5?*ѥ}7K$]dQ2sËR7Y*"ys!ܲ9j@43s^qaгr3w(m-f }*44l$2 WBЮlbӲ-Q3y u]KUne5CUO0) gҫ9z鑘6:a1z"nYGhz=9ix<TGy+v/"fN-$^kh,C66.= d lu'` JǐGy"!χ `Gw !94lB\ B6* xa?t7g[L+ajuQHҬʒ~D<Sdp@IOm<;T^E>"FNol~3q~rRf8W¤B+Jy$]aϭIJGQ|piE?(>Sş.xIq9F0H]Ĭ"g|W87O6$%Z$􅧫n/u?eO2k>*>wUAUܪz #xY\SEE4M8kc!18 E%UJ ᝯേ[6@}059\x-+V )5 m5Q+XڔMyjoN>;}߯fͤ#1B1¥CCYbz+pi_^^>uz$?Q&y[q]p1\-<opAp 6XS*e/^S[G>9Az-$uV~g~ŷ#uߤlz5CV2hPX\R]֮40k"wIok!X[']A Q 9 JCJ#ԏ >.98XD9|dX7nVG\l TTȍYwo'Vƭ&`NՖvU '4BZ"ƣiH^C_?nͫW AK/od>|*]fH K0;SR:2Cyv11e嶰^䛀%S˿|i_я",sN"F4;ߒsi#nO ywjkH63vTsҒߵ?5P@+Pk:biWƗeː2KVDc T!UWG&el69>X\$nr:'|_U3TH7*UleXVuL>q <=x8s*&s/ߛ~q&W=mn^ܠzOykΗw?iu۞nZlj-еM>"T!T& *)QaJ 8QBG<%y tWA/5"ibD4AtSCh̪*b=ͩ՛Weݓx{>b$й6IW0-`j`̠PqZ459zFt- O/||6^^db~ɷq1&/=fyAڸrHU9ՠS7>0xu*SF4ƎcP*Ԝ^TqܮlGF?$yiZZMe+f2Τ]պ,ZГHHˡ /Ka|93\{Lj1L |h:l[D1ڹ<@@U&k NnFI7eǠ]ȳTN_{޼w2{>@ވZ_/jS;}o=5g(_ރ xʤ?'RҍS}n4}k^c)0vߧ֋FVC1GoȄ>L3 .)Nw޳QbvM¸\a\/5DeaS{{p)xT1muyjlC\~')ő* XIC!Z͂Z垵6YȠF3b!'Z֨A6V諛Vb.ˀ޴t>G~/;Ij 8 ,.{mf&mksҺA<|Go| )]zݗ?أ~?Pn=~l/ɽ[vuN^.Ox-,B(ĂR fVдTh0jc0ylYjs7,Hs\%)BCQ)PjU7`6fZ"XO)eFp@D?otۓb<  <t͆-60G>F`Kui[sTCk:,cPe'1uDqF{JL`Ԉ@SU-`EXO+,K,nVM\։%V[c5ژYl > ta|Hq .e|l|o퇂d'7}r[*b. GkK5qjg=#f;+QoX"| SIbqәGqd Wسv|p7~&6UN3|hu;ϟu}+6l Rd6ЬY~$A0X015ePȟ x^ g3u1iXVmTVVмRUM&\\L:wYreJH͆"ЅbH|vfp/N?ߋj8[6cbC=vFőw穾f&f&3IzZ*Mqѹ;SDC]̈S\뺠B]U :*Y9lLX5L UmU*mclhD ^Z<;'/}l^[XN7{t/M,A)* )yy+>y}K?WnWjndEʈǐM((>r^ BjlO261^U<(m1]Ž]BYfm߲gŇ؛o|/ lT{{bܲ^F71"-B> 0.߮F1TvRJ$-kaޘpQLwQO+sҤ(SĸYk4/ШܐEg:Mmk&;4nFfqe?~n"$~^=ESpMjJ_:.Vg/_?Yr7A?1 C4H=U@vX?Y\_2}Ȥw@Dґs! 3WŅiyi&YU 6@d4Qs9&V[ƼxUxqa)*!#B"Q op:zf?\>T4_r|dg,),e/lOۓ0/чoq^mX<8ݷ8cspT!, Zү>Pz|1mnڒ_mTP(q(z#ClL ھH(ۼ%}bQs9ӝ| ~|dm?ԄжtQIʜYnC< 7ȩ䅱,¤SղTUB< !m*Tӌ vFq4*mUQI0h?>E8E$ N!!5Ft[&t\i(>/zۥa0 F!†{О؆~lBx[5s)#1 |HRSRf Y5Z>5u&HeRЛYhXD$u\(LWZG8%ڎpJZ( ;hvrjԬ-/\4x{#6nJ]/*z&p$вȷ3vxl}q۫ٲ-ז}˩D:2Ž7<\rsvη/{W@]l'`(q5߇/JHSywnGk)#@1xm߄*^V"4洰c}ReB{SB ea(jVW|/d+h̲,K ਠ sk _ "z{^}L"ȆiH3pAIDҽowQX2cCFC<*vfCޭ,!P[J#J&"CLjF mY8XynZ TsZH!#ġY]bb bk"`N3k۱`Bh7l"pxf&o++a% nEa=% M,Nh1 `mFext*{&˲:l}s+BOh IQE9,O~s!!JHB jʬxpnPr_X7;#+~ZTr#D)ɢ{P%WP 0zok+bպHayE6Ʈe3qnjXF"VyPFT 8 $?z{οn&c'eGRPx?lQgi!3Ԙ:DjL8_twLEPH R85+`_!ɫX9!,!0Ԇy׺e$%9Rb_cJf?3XOރ B0JYǓ%.rĴlĶ;r~ Z9 DOƳ٥{jOpFl- `lOHBLy<@,PeУU'!胟7 `2`09/6J!J9p -}$<9\Ak3Yr2 YrR/W;YȮ%340jF#JȋHGJM " B3/G=aP1zI!`/ǹo||'*ur1R']J#a$x:^].u" щ"dtB= E4#-0ՊbZ;꥙L4 0Y! z*(wmxIkХFrJ5 ޚ?]Iz`ֿ{z顢E2X%ǘ% 'Կ1֯nU7|&Ű[~9 \륂ap{ѡоܠ8~0$"C]y\84(Ȭhp1CSC?myk\re^d3Ms*s*-3r\G%Ҹ@9"m NlE5:_̻K0D ($K˂\s{o07 Y9eJ5bХ 2Suuğ=Ⱥ |H!# G?Bv hqh% H|ΡM̔e:qh21Di/1(2&ZS̥i6]N2:Dmߓ(`lilH)C`;YYq @y>xuk_Ýϭs*Q]b$@ݺ9qe˓"4(e~[6mi@4PJ tqp4h7#EznX` ~"y]ݔ]G&9wr.#ĢB*K#A@BAҀ۽o/|P@{UͿS"g("HhKyg}-.߬iYg+R.ED\B.=d>jAE`r[k9;EyN4@:$gmiceDRK:"m ؚљP}`A \/|/VMX{{Ur9y `p(( fb|o*rsqOPMHĮΙt&;E:bPg?U/2 +q ,YV4;Hn3.!b,wf0gt3;:t`=B,4"HkvK+}A۷Gx| `FMۓwA}ԭ8|nC-(zHr(FסaL:$v$o*~)/1 J 1D\}JَРB6b`(o ܆=uoa@0¦H2}_fdl ΐAVq)N7޷3߯5`O%FěNdACI(v!Tx&>߮? 6X5 bN֩-9{gm!%bQ!qksj"Qc4z+v")螌LQ05.h_cwM4"-6rU> ͪ:k C`]$]1S(]6.ߓw)Y [#ŰۯD* =XPCfe,ڤ&4iihiH|3fČuN2;xaDNy5W>8MOnBڶ8!\)0Ls]+X ) V47{_in*4q n(XS1S4XQX3p\t"0֓:m7| @[pf%3 .>/>DCLAmСy<,0R􊁗̶jEHMRe.FaTT3< -2@`hDut IDAToΞ5͔@+_I w_v39"XC5/ة**[ >۬I%TCh #!qa#IL̉~ f@#0rAl2›Gxl9*)S-{ml1}%o6pږ י+5օ)F4ȄL~᭞承į=&HtQ2IǪ-8gYto|ض v0nq[w1д-<>+5ҭ!9Cr[9=qI 󸤓+[Xcﮖ)1c}ƒ~دؖ]ؿvHM}"5Cy%L$x9 ^O}\Pua{>l~6=}\ds\KD.'i Wxr.\AoUR,]*|W֛Tq=7^xxH]\"{vw.6&a>Mؗ$8CDUm>f">ޙ~fFOYO:/r,lnR2ňSt9o f( bȢEZW_ t[Ԗx97(e-.@;٬k{oYMLerD:Ye B,cT ^C\t1D>v9H}2eh݆]k2 *.ڃ@4[?iSXcI8z vd}= d z cWLŒEc5۰{,ks152Q7Su.S^1:t9cC+9}QbJ5&׮Ӡb0}nO UAxx8 | $gLJ\~dt~!-4OԁlN2U{z ;VҠRnGӎ3.4PW g8i=FQc,xTҧ swqSpwcLWt#ӛt% n|4Be3kO `;v Ύ_ěbwP/ RpQbm25&."Z{X߶!ow}k5]97pnYg?Yo/L*$|\ȥxлAXD6HS&Qb4l"JLaմXґCa5\Q2E  fMz,܃7nF>btͯu/I|-d:͛J!*ڟ nKr6 $"L* E#3Uf[hAZ(/ꩌ/q=N>U{fkYS2+sG J֦p(\@{1Bo SMEH0I%p0)]YksMk.vT>i6 []k _P* ;G>zhWAf K3 [?  #%&Vߓ̾WO7_}_vm,VCe]uQ~g a$^eFg5ܡI%Jn>oO_| h/IjC]?TaJOy@r!3,$\D>LؼD/S:F?}t!1Y0"exdPX/ zdm,lpAf^&ECBѢ8.1;'oaT+(qy<s-߮?хo"_ d7YɏB1-珥|ϟȩ{2&~T"6QomHeҥH6t]GDLSU') k]F|sO_Ii߶,^rL1Hq5Fm3TWk3wzH\+;]2eCa D6n//&u&^y wU{V$ą)tC2)BoٗGh9>}`zGatNGۘbnE*GOt|(d->' ]372:L8 :d.y fz15;Rp*OmZT'TUF3V tF"!q88S™7߈n  [WDdTYMv 嘘eZ# \`%{v'Y+ ds2g.':Kt)R-`S na YеW./T5U՝DPBF Ǔ=Vb ћCF'.Ǟ9op57풾g|Js:9vn=Hw޹>iC(Vy5%u h'NRD 5жvm w+r9Ab~t-?W=?ؿXbTfO!wxYt!N^`3_ ,|M&5Ҥ$Qe*;w=xp&l.i F^t3uR/d|0,w_Oglr$(”d ^MD[f:uVk뀷jc ,;@}tOԶgo(r{ax`ϔWAu%Ljx@AὌF#T1 't݆E@s˹3s&rK~TKP6]ӵ溗 =zvj?;sk:8>gJFrގ,RgHf-m]j&k<\?;ށ{ӏ2{wv/cz Z8>x ezݎjٟݽ/4ˋ\.n9K(uWޗwt@uBq'(7VJs-fzB3ΧdapKQN 9q>ղmTFPA?+pj8;k 51n[&D;\meqsMtR[h`pM(S7JC̿Ye _ ~Ǯ/=ʪDY(OK> ?rzD͑:jjqCtqE Ҵ=z;5ɥj.Nd.?0yH|Ԏ+~7ޗ^1N 諀HmZj@o_{';r;s]`ꩌIk'?Ot19XeQkx5=bԽq;_=:V2h{X׻XSoFr{yG]=C\'ML"L#kv݃%5?ߞ+y(=W)pv.ǒ6N$*G~$p+AW5:O+)E!N y7Zn{+ ,AјL` !acҁt czP\/ۥ+ BLM}֗~{2j;RsC5]ycjjSJ>7i#zrI[., r'^=ӥG,^b־-.>^OW>,(_,{pGr6aW-c-#Y;s=Q,ޕgwSp)Kt'wG;h+|/nZ.]^ЭvL\W2_ߑ{vߘӗ|]Tn"I*AUG"aҊVŕf+]A ٛw?\T~3/~n+œ`y;D #P܊DD'7q17&|p/մC Qe0% S{OUM7\_vxG51aԔ+zF'R8Y0&4|{ `EqY?,|~^e}6utӼ %)Mx@/)fzoz>6%7֧Xф8e7Sy7mma,$ogP=;Dwv t7齏}|/a:{w6^ubk,W34뱬,`zSFTSFIQ[IH͑, v%QJ2Ll$[oaɳFHfjjʜ 9wb̴eBөNt"&B7XUP_ ]% U :1r=1_!,^kO붜^tC}&A3&ab-4{\`Bx'{UEp}+g~%t4?iښ7[ؚbk–{<.f".GW[i,ŅwUf3c]0b&HZ闌So4OX0ؘ;Vc] א+VR'w{P`0,D6gJN! ߥE%u٫_s5oLlM!&lMp% Lj:ze_8v VyB#}vTХ${j 1$ohD٘`>9ʼnӇ=:|󬭦[M ,մ/f;_^<գӃn*mqnKw]ō h3gsH|'*ɹY![{Mӓ?bfS:ўְpwLd ʄSN 7Q OnDUbR Sz'^.6ds,BT7TR[G#*3L,rjlP&* @yY\N7>?RrGMin{I}kJ^2XU,jW 'jQ YD#,U:?g'q&1ckPjÂF]ΛN5zӨ3׉j'5}௡g`w7Ń<;{t}7/~@0[/~VϟŞ!| )ePJ꙳.{C)QMB81*'0NwW❏o|7Ғy2bymY< '2!d"S ZC)JA(* ,ձ0Ba7 ra/7a'FHN,bkْ3^`bWpi,XaBŵ6^|o{z=M{MRGI5$5Py6ڊ5k*IeY;],N Hi]~7џOY% HFYdKT0BմS(Zv25fH]ԑ]́]]ۗ{zfWb{{L3r, Ď0L)"5Xo@! WIEIdI;[oԿh~,- e4Ynn;'#A&Ytj:%T͏$JR.%[AJ#4HU VgAs&_"Qe&ǖ0Č23y&؉crB<֙Gx/~z|5Bs;)A5EJLbGIm!Rc59o yM5ikI[lM?6AWT ` ]ݟ_6?_|]=o>y1s >YR\א\M6v-ѶDlf#Z[m\]=>{_-NF~ T(LWd3Ӟ -e$1i237.[O_d_>\Ѥt"w< y\ ضSE~$Gd$+D821-XdBz5ЁΉEadbW<R&uScLqKtr$ēP3*+)SR4|g>6ה13m+kV4)ܘMf^ڻ3 K׻{{O;]wC IDATΦ Y-ù$2C)d1ʊUZzl`Bj293ŤwOd~hvon Nshtw^_Ϻ؍l7-f9VK/mO˼k2t .d:tQK.Q\Lfxo &||[{!>Ψ՟?)_|]k 0iI9-XViӸLTt Db6cJ2+I,X Pbc hDGZpVYB -8שL-cfӼyQK1;؉;e 6ٸ$MX*N]4%F)48qcH"m3F[1b=(6nJ- v"URn3I~eL]o%X,:*sOJ0 &c#G8u&ut9m\դv{" A$z53jY2eZr[&yweҍuڎd܎$B|.%$j՘Ř 甫ZIjE*fxh.o>=a;DYf I$UjwѴ(c+#!GbPXIb)D=? 0c-Xi%c7#7_.Ѝk)v]FB!kxU%b6?țMm]l ]g:"vDXĚ"MRCZm'FnHP1f|i(URa$صGx=O;>O*?Zjꃓ"8:wՋ*bB"bn:_#u6]ua'h:uژhEXd敃oSG_[s2S mZ@7UGAt 2NX1neW,ƌ&iD"i"c\}~yr?|uwGвmòsl=,(P!R Le6S*sBdlԩ\({3 ?LWk9\g[\}.N~rHEமY1XCXKXm~G[mfx!X'I*17#c锍Hu2M={qgg苋=X !YHȕz*RCem]W 9[_[7LXL"=27_69!/52jt~u~Bj$,oE7}/m˧g4k6Dsg6֣Me| O)R ,d):2DSuL D~GOu5}Sj*47{Nܻ擷>ҏ}w)S4pmoh.a_2dQB6f!݆ƚ )\mm"9ޚd#"WFM[/./q}|ab_ގok{҂P Y͙uc8Awʁ0jH'_2f,Fo闫7=7-(RU +S)G|*Keu> X:nxsٙDz:߷>ÝGN(JDF-)mc@AA^?XE? H^ 'PDVbXR$[@87s w:VιUխ&E DK8}owuW78cvm6d8QIƒ%[5[@UKREm곜M Pk̺s̯e\֦lk5Ԥ1+֙XwӜM\[U]i-XUhx7}/}Z; z/7;5 wx'ϯvG^k'Ox=z뵿x]i7ͪ)04KM*L1&2&bEB+rA 2.YTվt~GWy&NJ|clsb?Ga &*  G bQUx='JGڤ,h-&:3r6uEu1[ +Ҥ;^N/<[>>rMM[W1q?vc+ڕ'n|[HVAB!̹D,k EH)PHM{3O3߹@ Lj(#;~.MgQXh35muM*CH`,ZtvӦxTEBg9tDj䤪]v|Hܺ|;?u_ZPK_yk2pOz0NQkBd LQhh0F4LnB Y] bIqW]R")`xh%3HfwZdSv|AH"` A# ’9DPr5wDN@J9d)pV·^xx#.O^{'WիOG+N"** D5EzjЋmr.D̄ZP='9u:HT@wb$bi)C5CPHGt!*c$8aQLB -k;mR"LKj5wmj=޺c>_t=O_I?OY,?Tsk(slE0C4CT(XttϦ#.^&%%et]Z5ghCT4T<^?%GjRM R05] W_y_K7VNSp~+Ev鹏\j&o镩;X^E8JELV+.|dM8:6T-d!⺃,[XXfWle9ox> vQuhRLq47:69SjڭWL:wmZo=ҋOW^c=2Ucj7jow߹Ѩ4q|(e4 !M1IDmW)u4K2L.2Lwj H4lP8nEڲzLͪK\o\w9Vك E@3!N(]}"qBI%HI ,R:[St1ֺRW,Et2޶QEPReF sTH(H2f bxqZwre_}wG;?B=]w ^R b=}+.E%my*Yf(JXZ Ur)юv9 wRf\!S*cVF ʈc*4.NF^~y?_><ɗޞwp~?|ͯiK$O%AG (c6t:`”DgV4VIDk:S&ژcO>|`ɗD=]:}=e,Esp~zdv[t+\{4.NX`%EnDB% LP @C@dVpHuBT=>{3ڻ/ _|/'Tt z%ē? @((.QjTuzTup: 4u.U?@-w-1hRuNfwq;c(/׋}6j J wk0a( G d1!h`&&ddZ3sŒ~K2^?|ꛟ:LW^5sCO_KVAXI" "A^2䒊@E/+\]Dd o:@Ŝǽ 1U's`'JYιp~ @P?`VGp"iAW D DmiH(5x 0 Y fT0T4Dْk\NL~8(ٚji~탟r!9:;&'^lsbU`&0 004+haVTnȝ]xyrDP_&!{SWXސ>aWSA0a+-Qa=y@Bh'bQ#ύ plV~"v>=\P0P"K6: Qd "pW | Bpo`wwq"4U4PFL#L# A/睐ؕrR6+`}O~'oR ؤ{ [0]P`V@Ln^J.;u, uGP#87p#8 {v؏- MdƛJz+!vy2,&E' gNrr^HG/S "L \;.;`Ƀs  s:gSjgeS`?@{ho{ xw@r֜owƽ!eXO3a9?[k盤2|Pi pdܤVs3}wcyC3ʦhwϮ^oR8ؙv`?`t W^.`4<(RlZ !uS <o& 8݂po'a>H\~']``Fޝr [#oOځDs=I a}y,j9N@ﵩY߶p n]X .V^8o;m B4 @aa?%a'{Sᮩ@hĄ#o{+݋wy{]zip?Amf6`o6[aئ8<an@ i5ǰNgXll@Z$5 Iˏ{p/٦o{]]8!M  T\nx 61k, ã~TA.!^7 Ns0f 093@cHG;]+*koZ ~C̠ 0 t}vX QI!lN ` G8<'AU-Жsu>k.EetYff42iVPf9u b&' ~\؆6o&a1Bm-A..DM#U@ f12 qIvWHU0bEqpUM[ rOSԡn6kX`-0~ /%)EކAKpY0 "8?TD*_ԓO52X2yZًdVlRT$Эjֽ|]xՎ'˼-0fNqx83 , یڐ(CEZ,'so <?Ru3&QXk*YÑ)D@[عxf!xYj! f8]73b#09c.[ĠڧPa0 +QA@1X٨HyaF4֖ڡ¢,@ X hN@Ù:NZB3CdKETB|ЧڷDaT/ʛm*hSZ @ C`A0V! Ah?{w g@ V}ہ.[l٦?{෍ 3DJIxx XL@ ?al`!g.eXg6J@lhDdBt(*.@U\j|ytT9U9YDc2H2P&S=mT eraZT04qоy`btH{W3Th?^hFAMĨ&BUE\|y[gMs@:@Z4ɘ;#٣6>=Q٭ED9>چɕl]ݙT@ f8~rxǸM0S(HfLfL0&3V64],l=; Ý.7#lɪ5iJ+)3(XdkV+>anz|a|{e? !^)6c0 5e LAњYc&kմ6lZ`R>KU I/ê #0ВZS~[]W%s9=?t\%t ҟ A> $a0`D-d"" ))9ATo%*٠ ȝ(AC:ИT6׌cKݑ|d9q1dyS`P>G''߼zr{|= 9 iFvJ$ `A E <y bja,#bظc[;6uGެν7z~W]A`LW s}+J 62f%DA p P!@! ED?POv7-̐a3Y[Ʊ)xPosۿ,E-0*|'4ZxF=;ED5[=;dճCd\IDATZM.A1F[au^yMr*9Hm3Fjk4)WG;;QhbPb !7$b>tՖ4c(:`#i]~㋺ s"/~288 8.88 8.88 8.88 8.88 8.88 8.88 8.88 8.88 8._qpqq\qpqq\qpqq\qpqq\qpqq~&?I]wIENDB`globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/init.c0000664000175000017500000001516111516033422021646 0ustar takakitakaki/* GLSL_parallax: Parallax mapping with GLSL shaders Copyright (C) 2007 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "init.h" #include "textfile.h" void InitLighting(struct Light *l, struct Material *m) { glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, m->mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, m->mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, m->mat_shininess); glLightfv(GL_LIGHT0, GL_AMBIENT, l->ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, l->diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, l->specular); glLightfv(GL_LIGHT0, GL_POSITION, l->position); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.5); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.25); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void InitShaders(struct Shader *sh) { char *vs, *fs; sh->p = glCreateProgram(); sh->v = glCreateShader(GL_VERTEX_SHADER); vs = textFileRead("shader.vert"); const char *vv = vs; glShaderSource(sh->v, 1, &vv, NULL); free(vs); glCompileShader(sh->v); glAttachShader(sh->p, sh->v); sh->f = glCreateShader(GL_FRAGMENT_SHADER); fs = textFileRead("shader.frag"); const char *ff = fs; glShaderSource(sh->f, 1, &ff, NULL); free(fs); glCompileShader(sh->f); glAttachShader(sh->p, sh->f); glLinkProgram(sh->p); printObjectInfoLog(sh->v); printObjectInfoLog(sh->f); printObjectInfoLog(sh->p); glUseProgram(sh->p); sh->tex0 = glGetUniformLocation(sh->p, "Tex0"); sh->tex1 = glGetUniformLocation(sh->p, "Tex1"); sh->tex2 = glGetUniformLocation(sh->p, "Tex2"); glUniform1i(sh->tex0, 0); glUniform1i(sh->tex1, 1); glUniform1i(sh->tex2, 2); } void InitTextures(GLuint texid[]) { SDL_Surface *image; if (!(image = (SDL_Surface *) IMG_Load("colormap.png"))) { printf("Color map load error"); exit(-1); } glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glGenTextures(1, &texid[0]); glBindTexture(GL_TEXTURE_2D, texid[0]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->w, image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); SDL_FreeSurface(image); if (!(image = (SDL_Surface *) IMG_Load("parallaxmap.png"))) { printf("Parallax map load error"); exit(-1); } glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glGenTextures(1, &texid[1]); glBindTexture(GL_TEXTURE_2D, texid[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels); SDL_FreeSurface(image); if (!(image = (SDL_Surface *) IMG_Load("glossmap.png"))) { printf("Gloss map load error"); exit(-1); } glActiveTexture(GL_TEXTURE2); glEnable(GL_TEXTURE_2D); glGenTextures(1, &texid[2]); glBindTexture(GL_TEXTURE_2D, texid[2]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->w, image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, image->pixels); SDL_FreeSurface(image); glActiveTexture(GL_TEXTURE3); // Holding tangent information glEnable(GL_TEXTURE_2D); glGenTextures(1, &texid[3]); glBindTexture(GL_TEXTURE_3D, texid[3]); } void InitVBOs(GLuint vboid[]) { GLfloat vertices[] = { -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, // Front -1.0,-1.0,-1.0, -1.0, 1.0,-1.0, 1.0, 1.0,-1.0, 1.0,-1.0,-1.0, // Back -1.0, 1.0,-1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,-1.0, // Top -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,-1.0, 1.0, -1.0,-1.0, 1.0, // Bottom 1.0,-1.0,-1.0, 1.0, 1.0,-1.0, 1.0, 1.0, 1.0, 1.0,-1.0, 1.0, // Right -1.0,-1.0,-1.0, -1.0,-1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0,-1.0 // Left }; GLfloat texcoords[] = { 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Front 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // Back 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // Top 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Bottom 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // Right 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0 // Left }; GLfloat normals[] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Front 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, // Back 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // Top 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, // Bottom 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Right -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f // Left }; GLfloat tangents[] = { -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // Front 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Back -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // Top 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Right 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f // Left }; glGenBuffers(4, vboid); glBindBuffer(GL_ARRAY_BUFFER, vboid[0]); glBufferData(GL_ARRAY_BUFFER, (24*3)*sizeof(GLfloat), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vboid[1]); glBufferData(GL_ARRAY_BUFFER, (24*2)*sizeof(GLfloat), texcoords, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vboid[2]); glBufferData(GL_ARRAY_BUFFER, (24*3)*sizeof(GLfloat), normals, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vboid[3]); glBufferData(GL_ARRAY_BUFFER, (24*3)*sizeof(GLfloat), tangents, GL_STATIC_DRAW); } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/shader.vert0000664000175000017500000000173411516033422022710 0ustar takakitakaki// VERTEX: Phong shading with Blinn-Phong lighting, Point light (per pixel) // Tangent space parallax mapping with offset limiting varying vec3 ecPos, normal, lightDir; varying vec4 ambientGlobal, ambient, diffuse; void main(void) { ecPos = vec3(gl_ModelViewMatrix * gl_Vertex); normal = normalize(gl_NormalMatrix * gl_Normal); vec3 tangent = normalize(gl_NormalMatrix * vec3(gl_MultiTexCoord3)); vec3 binormal = cross(normal, tangent); mat3 tbnMatrix = mat3(tangent, binormal, normal); lightDir = gl_LightSource[0].position.xyz - ecPos; lightDir = tbnMatrix * lightDir; ecPos = tbnMatrix * (-ecPos); ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient; ambient = gl_LightSource[0].ambient * gl_FrontMaterial.ambient; diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse; normal = tbnMatrix * normal; gl_Position = ftransform(); gl_TexCoord[0] = gl_MultiTexCoord0; gl_TexCoord[1] = gl_MultiTexCoord1; gl_TexCoord[2] = gl_MultiTexCoord2; } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/extra.c0000664000175000017500000001024411516033422022023 0ustar takakitakaki/* GLSL_parallax: Parallax mapping with with GLSL shaders Copyright (C) 2007 Angelo "Encelo" Theodorou This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "init.h" void UpdateLight(struct Light *l) { glLightfv(GL_LIGHT0, GL_POSITION, l->position); glLightfv(GL_LIGHT0, GL_AMBIENT, l->ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, l->diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, l->specular); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glColor3f(l->diffuse[0], l->diffuse[1], l->diffuse[2]); glPushMatrix(); glBegin(GL_QUADS); glVertex3f(l->position[0]+0.025f, l->position[1]+0.025f, l->position[2]); glVertex3f(l->position[0]-0.025f, l->position[1]+0.025f, l->position[2]); glVertex3f(l->position[0]-0.025f, l->position[1]-0.025f, l->position[2]); glVertex3f(l->position[0]+0.025f, l->position[1]-0.025f, l->position[2]); glEnd(); glPopMatrix(); glPopAttrib(); } void DrawCube(GLuint vboid[]) { glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, vboid[0]); glVertexPointer(3, GL_FLOAT, 0, NULL); glClientActiveTexture(GL_TEXTURE0); glBindBuffer(GL_ARRAY_BUFFER, vboid[1]); glTexCoordPointer(2, GL_FLOAT, 0, NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE1); glBindBuffer(GL_ARRAY_BUFFER, vboid[1]); glTexCoordPointer(2, GL_FLOAT, 0, NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTexture(GL_TEXTURE2); glBindBuffer(GL_ARRAY_BUFFER, vboid[1]); glTexCoordPointer(2, GL_FLOAT, 0, NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, vboid[2]); glNormalPointer(GL_FLOAT, 0, NULL); glEnableClientState(GL_NORMAL_ARRAY); glClientActiveTexture(GL_TEXTURE3); glBindBuffer(GL_ARRAY_BUFFER, vboid[3]); glTexCoordPointer(3, GL_FLOAT, 0, NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDrawArrays(GL_QUADS, 0, 24); } /* Replaces gluPerspective. Sets the frustum to perspective mode. * fovY - Field of vision in degrees in the y direction * aspect - Aspect ratio of the viewport * zNear - The near clipping distance * zFar - The far clipping distance */ void perspectiveGL(GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar) { GLdouble fW, fH; fH = tan( (fovY / 2) / 180 * M_PIl ) * zNear; fW = fH * aspect; glFrustum( -fW, fW, -fH, fH, zNear, zFar ); } /* Calculate frame interval and print FPS each 5s */ int FrameTiming(void) { Uint32 interval; static Uint32 current, last = 0, five = 0, nframes = 0; current = SDL_GetTicks(); nframes++; if (current - five > 5*1000) { printf("%u frames in 5 seconds = %.1f FPS\n", nframes, (float)nframes/5.0f); nframes = 0; five = current; } interval = current - last; last = current; return interval; } /* Print errors from shaders and programs */ void printObjectInfoLog(GLuint obj) { int infologLength = 0; int charsWritten = 0; char *infoLog; if (glIsShader(obj) == GL_TRUE) glGetShaderiv(obj, GL_INFO_LOG_LENGTH, &infologLength); else glGetProgramiv(obj, GL_INFO_LOG_LENGTH, &infologLength); if (infologLength > 1) { infoLog = (char *)malloc(infologLength); if (glIsShader(obj) == GL_TRUE) { glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog); printf("Shader InfoLog: %s\n", infoLog); } else { glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog); printf("Program InfoLog: %s\n", infoLog); } free(infoLog); } } globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/init.h0000664000175000017500000000102711516033422021647 0ustar takakitakaki/* GLSL_parallax: Parallax mapping with GLSL shaders Copyright (C) 2007 Angelo "Encelo" Theodorou */ struct Shader { GLuint v, f, p; GLint tex0, tex1, tex2; }; struct Light { GLfloat ambient[4]; GLfloat diffuse[4]; GLfloat specular[4]; GLfloat position[4]; }; struct Material { GLfloat mat_diffuse[4]; GLfloat mat_specular[4]; GLfloat mat_shininess[1]; }; void InitLighting(struct Light *l, struct Material *m); void InitShaders(struct Shader *sh); void InitTextures(GLuint texid[]); void InitVBOs(GLuint vboid[]); globs-0.2.0~svn50/src/benchmarks/GLSL_parallax/globs_info.json0000664000175000017500000000044611516033422023553 0ustar takakitakaki{ "info": { "name" : "GLSL_parallax", "author" : "Angelo \"Encelo\" Theodorou", "version" : "1.0", "description" : "Parallax mapping with offset limiting", "glversion" : "2.0", "file" : "glsl_parallax", "defaults" : {"fullscreen":false, "width":640, "height":480, "time":5} } } globs-0.2.0~svn50/TODO0000664000175000017500000000314111516033401013666 0ustar takakitakaki-- globs-0.2 benchmarks/ swap Mars logo textures with globs one? gl_blit, more like Mars' Image class submission system check the reported bug about UTF-8 adapt to the new database -- globs-0.3 and later - main_win.py handle environment variables: __GL_SYNC_TO_VBLANK __GL_FSAA_MODE __GL_LOG_MAX_ANISO gray out not supported benchmarks (eg. missing an extension) - statistics.py export graphic data from the session and the database - stats_area.py make a clear button to erase the statistics? - pref_win.py how many previous history bars to show? where to save globs.db? internal/external sqlite module with/out matplotlib some sort of Compiz-Fusion support via compizconfig-python (eg. "disable Compiz while benching?") - preferences.py a class managing ans storing all user preferences (in globs.db) - benchmarks/ better description about which capabilities/features are stressed more support for benchmark categories and different unit of measurement (MB/s, fps, FLOPS) write some shader stressing benchmarks ask GPUBench team for integration of their tests into globs support custom benchmarks options in the gui (eg. how many particles for GL_smoke) -- Database - local db, user db, remote db use constraints and referential integrity? - remote_db.py fetch an export php script online and gather information inside a sqlite db -- Problems - remote db: benchmarks could be related to updated machines which do not reflect the hw which actually ran the bench (howtofix: show always the date for the last user/machine update and result submission) globs-0.2.0~svn50/pixmaps/0000775000175000017500000000000011516033442014665 5ustar takakitakakiglobs-0.2.0~svn50/pixmaps/globs.png0000664000175000017500000011742011516033401016501 0ustar takakitakakiPNG  IHDRZ= IDATxgeuOuF# "H -QDm (ftl6ϭ՝I m'"5X_KQA6q_rGјHskW>]5SS0-,C: Nd.B` x9,`CJ:c0J;+| Ov/Mm w,?ŹE]81wiZcDRsA.o1 nV~l4&A>1ve™ͥjufZi̲v_rG}f"|nm?i69u=##{ D 4ȉdVsϹ35H91?98gSӇp5!^{ݫ'^̲v_r}zVkY=s'g?iCTE1˖[^nÍq0s<7F~Y?C%m`r`4<43zea}F>;v}neoO_x`䩏Qqr=r _0'ȉ?JZGi:էߢKCexd(bY;nbqcUTb$i4i0h}u7 $@ :Oj1&^J7Uv<ЧNyu^X8;zޏ!0!2ovϽ}#Ij RT/ 5۵FWRgYk/kt{O Y^ 8 `}xxvXQL۷pCCMZG҇AГ) Eae._~]=uе_"$}ܔrP+FdG}zn<'&N;{qiIR D~0)%!%hMc|)§!Mf7md2n|wRg{uGý[\hQoNh+oӆ`g[D[ܽѓw{66nէ+/-|ED_TEZ>x]ٱ]w/^\U>}|3H:8 b~0 Ϲـ`3|6iLIa'Kt~HMH!SLML89o7KiX̲߻::gVydu?6>]4?3sdשM>ػ^T*/G0 s.*LiZ~ǧgNdYsRf*juZQvdT⭐ }|Z5}?ji IRCT ֺRdV/?pX8`c~`p 2(J01?ȫs8;Y9j>Zm+5 ;Ч0& '27aʾ#sa144zo3ZG/2TەJcqMUv$ЇG߻t7&'N)م48N!88!M)ҀCMCL:aioRk % /kt[-'DI6r捗jW*JVwc{(J3C>0nMtvr>o`[3}/>a<6Vkk'ө/Y{q@>4zQ>rGw#MTHҴHDN:s=N0m/74qr_ہo]v ˮ%f/Dٻ05}h\'{i>z}ln,Zw>]4kU2&&CL^Ӻ/;{09} $CCӘ?c׎nn,ijQ켑fs:5u`GPR$ L؍83zКZzD䴹X0y<<Q9%m4>TT^=鬟)8jujVW+ã!!3Q|Zt)W*wp}qO`jꠉ^Xdz @| sx^y2rWIϻv_KJ{Na||ʥkkWFҴrQnuˎbݧ]_>{} ZF>zcjqR1DzʱRamM\z|%DED(6n1ĆىmŒ-E5ʱeu9{@ "`8ׯ'Sj(NB6~^a dzY-`hM# ElL =5؎2Vyow$cn7{le\_MN~9y.P]\Y 253QzL89֗i$|.5Q Рc j+/e'zG1@FZ˿05ups *!jH*8sMǘnZ, 1 (B$t7=b$qb@n9 (k naCӂ}/Z-l. ,U(WE-"!2a ' 6Nf{WgBv1vjYd%Aڲ0a'{."LL,,k^X-4_y't;qdR~<ϻ?}O$UTiZCV͠q%K (r3p9gYh@CEV'q a.7Z܃;`ƇtVSQk[s;MhR ̠J|+ȝ^Y+jZg~X4Uh;{jrq3d'gk-(y|b!Ev i٢-׏̝#;SSFWWJ<{ޟAԐuS#337Ov}~\ KDVք&F#c2}N}ؤnej0Sg@ f%ӝwD#J~=wh%gIW{\COܘ[[ T*MLLH[{]}f)kIc2NNOcJxdw&;l&*qK-4-ς0ˬ;+#0Hvsqp0HB(PT% '4& MI,ckxiyE0 uf]RF gn@ @MIǖ  iCI, Zn.571:_|ryDΔȎɲ;8Aj8i\QFmMY}s4,3aK3洡7-}E3Q _Au8֝G\25]r&2HK>v>">7Dݜh&U#53)mt!ȳc'8ѾӴ81,67 Mi@.>3#ì[NT{?݁ܺa <`KD$yCaC^ےn1DCr&e Ân6}&D9"3rDgYR¥NyPXlcO3A*9zn%S;Nn{}jzk/F铥msX2]xy&~40Vg!(|Y .!AB X )u{j$i;+U8݂܀1!jr P!ȁtD&\4"rPlI PR$<:3XHac>ɏsґ?¿Rfwtmt"UЬV%1 /D-@Rتm-ۉ3 ƽ-%TY]ew@C2@!KI>h< b6X΃-Lv}H~st"MФ6?A'XrжӈU"%%24`4`o//'޲(=Ћ"oh M.> S+0cЌ: & />+B0@avc*Ѣ`:4 9(l(T&o=Dqbr>PVks8@E0X<Z rfзDЩB3a%RB"R)vF FVG9w'kD ^݈FDza vX~_ۛt & p4n Eلc~H\1H@'%\$& LjAT,g @1nb@TB`/>``R~aXĤGі^m l˺CPdڌ_۞QgKp!geYR2-CR˂Aے]wWг]Ht΁HQK1x/\+O}zWg DQL 9"ٸhܹrkt΄@vSBr,#fq)h~zd (Mx:n =0ii8Jr_^w)iFψ _+qarn0 *_f'i@s @`LB2Xm4a7wA_CƴVfg[Zzu`N.c+o "mp"G!b]De[TBt iqHx, Ne{Mnރ[:Y?'gsh]XI8tr3ΈL%~4XF u\35a0K@I'snȝ{?2=wBv>9؉Ҟ3!H]Zzm/j\cNgM(r,SEfrX`Lv"bB,Ǖ6?!gFyssC Y>H M:J9GQOReΑ8p_p1XPm64-,uw"X0$9KzLq~ ^T,wOvbgJ'Ay?F$(?:maq{ IDATssfĢȑQf&T#XT֢FK1 άVSR)l٩u3( #ts3XG[hC͓pDd<AHs1k!@vc]k;׀}Z2LJ`%30 9/g9"=(VL=M'NX8``d@ѝ =J$onTJJ`-F*/mކԚ7ZpXWu3B ,ˠB$%xu.@1C,T!t"1Gpp$1/ CR\ x7nθD(^_5bvn+۸9?0Fެ/O/=z7`mtVgY噡i9RsOjӃPWdh.EBȳY#2€ " ʐ@EiJ")i 1"iwʪ t-V $[-kwH!@IkxʚN3,}`G?kf8wh(0- ;Ө=;F_/i'ʎTRn|̞\bJQ0& -|Z$R 3A(y덒Ϸ'cRPLz`VfT r-HI߷q_k3!:)e5G WE)uSls%a_DjDcon./&i/\}Ggw3eDAD9Opɲ6Kti,<(J!e(N144Z} S TH:i݁^* (L<BrtkX_' 50<##3Ĭ %KQ /IF^k^.4a}f;b+9w]LŚkv{)e8&9ap;]٤'H,:~ K%,jtG-ƸcWV.?vyt-2K2%5HYkvy,.< Ij>hMcll#Q"+A8F{s<]#FMWn-ZBWŋO@w߃ɩ.bI`3/=9,Nјv@lk^d^cL$BٓwOݲΥDcEpygS ]1ہ{}+@Av`%w(@wg׏^dsu2>Gއ3h4 Μ泄D : ]Ɯ6c|M4m MC+rI|鋿ѱ8?#b9hv`EX (lyQ0ԭ/{ULA7WDG;d7ܣ }]zc^{-Sʁ\Gik:VZq@gLy;5:Cރ={N94vNy!oP1gre> @$k" ٜB1ɩؽ$.]z 'v{)p1+X0%yܢIg12/! b0K5g(Ydl'_я~@䱈,}j38?ٔ@(AJq׮+*}~+o33RIσuubL}}J*c;j]7܅;*׉T7fjx?;BO[u7?n|TsBC4=sI0.,IH0_͂1Lna8Uz\naԑV (@<ɩCw{CZ st;mZ-t:mz͋HGsmmƌ7q!;X_kİHH~kMe!UEq6w Qx6rViLwIjc5ٝpK7_.Fo4&w_$Iߪǥ~- 0ƔrC\(I>洦Ɉ1!O,`|l?ou1:6bۛh6^"UXLJǀ;0vU`VhQ)Դ-6%4sEåU]]C+Vs嘜67 \N9=_tאDa[AEW4YxgP%D>_O9J w ׳kǗo ٬ ͍oaNRON2^#>$Iq\_}I@YZK,h8@>yv+v0Z3{:vQ'3_A6Q!;@WP4L.E%ۭ6#Mbs^2gYK΀շ^@gz3LKϻo.LV۶AYI]6Y [2ιd"y /ͥO$/m=-F>t͟<䩟H*H&Bap7ɘ7*>tep#ʓdt.`[. uiZ(r",aQ q7Mz*`3{} 7ޖǎw;kcɽ=}hϞpK͢k6@b[ }DUj!54҂O;0 ]BFA[dV11WܳlnVk:@Q=yVŰXp =}`u;8v\nV{UAp.ez= 4ߔJ`9|ט@@{?K@y >_") &?/ſs~:&ugԔɎ N3׃]wPz=$Ǐfg"IT&Sk&Of3Ԝ'lƹ|׬,lf駃-3MB_H(W\`~}љ{vR/vWzd6cj3]Z|w֍%ࢸaWa0m'Vu8K™`V ZuBڽ.LǶ Wi`ss e;X[ $ ){.6t Rut:k\ٜ'abb?f%+.^zoX\4LsK6b\d?6]rSi*&=x+W3++JF+YnEw5/c+˗D0>}Rea—1„5,%NqE#L{YnyMokhnb+yWנ.CV2G/k,ZM^e,.<@Gh41>{o^GJYmwߟ;qU?BDD@0)DZ"Y}7-=ˌrXF9`EHU%#zyE7-\f>,$w0f[:)KNei8p/\z1qA 8ֆj4&F(iAû0>csh6 dΝp-PB#EubD]hVqkkWx<֮ȻFhL ++o6jm0DCO^ƒv|y,_pSy%EM^s51,>FT"e@=:ynVw~ُSVQ4P6Lg]3Qzi,+YN~+ieۮ re[tJ\NWR! p|R/7"$Z3_$s>F}bRJ0FFvcl|/Q I꺖@D:xa("C&jE3%z׮qғX[BZc|b{0:8 HJ~{/ IDATJ 곅+. ݊]p4+v9\^y댈*}+Møx^頬2v%5T[[OfTo S$i iZC8JV@![ {I&;0LLzmBiFE@E mg7کWnMk K;m@'] ͱ^֮_T%MbJjy'\4E m@u7l), U)sg*^Nw5,-W^&{po<Ә`޳ pHUⴎ}8|a6jZ}B$*I+E[EƝcs|~8i94E\jõ\-@,zm08lBF6^5+i0ōI2`2gW>^QZs4{,Sѻ+ɥKO̯\,kv*^ EDЋ_c=Zm*!WHdvw8Hzln.ҥqғX]8x!;ݥb$}F˔f[Sc.p^Z3Iص=7a߄sM33Grq>yGlKQTbԾn//ctoFklug(SS ׋iřeBȤhk4\7ˏ'f~4O^~.&$X&X.!L{.{6L߳+76nP>QdY`VzTJfnw#!D -a3봆@*लM-tl xœO^=-c8v}#ؿ,͉,VgW۹VO-QnopcJwY16o^>\(SIR洛^{NNk~{.D6ʞ%dAd:R1$U94=qt|<ϻE:t(zl@kZ gǎhӕi^ Whm5 ppw <9/;,|vYY߃ӿ=}pĉCڄQk"U"1ַ䥐UPfl,P1K|ǐqLlϔUG[pwN0yBO(fw UvFw$i@wREE/"r.8@ˡdZ-Z˸|q\4z LL.?h4t|_~ -j-h~=/e(Z0Ϸ؄ju{WnZP-O67 i:̊yٻ}0Q&{͓G;Jb@馅z"3C? BgD?WujݣϬ0+~h:$Rf7?K4OO]Y+iZ?{@p>$q8*?ہ*P|cCs\pi\KRr sKf̾c+,?J9L=~mQC:I33Gp{E>^Y_tֆ3mH׊w;%~ **V:>{Y<.OC:áQΣ-JyI-aB(/uyrqa6={Nٜ\Yxjssq8Nj0T*,oZx1~񉽬b5 3*!jF!R$j0ì7V 84Al*4q. a@ 0sAܭ*";N*,c6gXDk>3g>n|)tɍϣYEI&\^!LN@4aOQ%LWb2k>6o@XkόKt1㑻>@33G_!"ju䋝j&o t_1읟?Es$w=}zC}Np%Á@a{F,Ǔ9W[XeQ/f"Px\qvRz'=孹p<& ](`n }yT"eBh:2!|I9PִrNB 3v_nn?l.+Z}v "bG8N晧xVG~vb[^+J?4GqjeLk֭:n~RΚ pg޼f6b~ۘ@hNB(O&\ t[ZKքka6 wљD]!̴2=JmLA?jA"[OTEvIwfAoԫ((yvv{yR~(htR4^$yؗYu}4f 0( AdK6eX?fBOGa!!"SڒI@옵gggz_~'d޺}tTrՒ9 GE{n\ʝ D4c˫Wϔ~%xoYu0%x9ZHڅD ?%:Ԇ+xt>;'LI&Œu堔ӯxU$@Eּ ΧYKqeTy#H4C멖 P}wk6o(1p̙ ŅP݉n5|<%UӯTG8*?H⺤"PAWP.l-d>kX ʀH]rd3Y]/R" rb10 ٟNfjzH"k͌A3)L)gM Y|L?YQRJk?Z_#ں́Q{uϱcqd8'/1$$?9JAB+~*9NS(K) U۪$@o=fz)IT %xAK>GZb Op(Yeq"D 4,(\"_)w0Ç r奸ylas.T۱I|v:k9ȳQNbL]C{_ʧڵA="f@_XXn߽[sK ǎ?0&?iy-/BKo冿8-w~BoH| JP0P$uckM=5u 0U$ /v!ێH<ؽ觐㏥>ɏb d_J 9Y|q@!Š_LR]ף=bI֚Gןch@osN[sz~0x|k|M=@0#M.%Pem=PB'&7%@ 怊ɤ AmL/2 vUO6q1uڱ[>\d[ Ymef!@OANJ_ mF?"WB$c xo2̪X%΀! Hv^s<^kqɾRy|k\Ǿf=E3Rz3ʺNQzCJ"<[aÏژ25x䇄(b~,s\ޏ+!H`*dՀ9`ʕ,T9' Wuhl*#]6vTYP֛1A3 ކe \! Bi01PD{P;aT4Oh?p>'nw`Hyi@Ey#`$ O7ju'Drx6@ `m1)~-9(ȻFKt+Dec(| y[:Qc 6 ؽyreT2'^|xg rFM Kаa8/S.A'ev:Ka)b9tnm] aJpxiwY³̙'??._?jVU6́>oV Pj̒&n5$a6DID Gef#1"o~u5'BQ{-u6Y*.%"jׁ s:#@U>MvPx%"cf R],)uL!TvFHNb0>cfVۛn xTBbO(< 'ћ77++W)sj4vg]ȻC'amԛk=% :UR.G,| -qp s9cAōS*elDQ HtPpA.r]WV_eTu2΂Ȟl嫝VS~[Hv;K3ڴkfʾ'3`~k\[8fsq$mp$~'_ ?Dȃvn?&Qes&`fo;}Rs@MUV^fu>SiNKHm Z.:m]x"ڎVV[E#͝oG[4:x4S±3} '0~2Qd "lk  'U8I XE];U ŋ~Fa*0!p;:)2yc` M>ae⏓|,#V@;/^'x/-?h/AV* 0~ܘEbie4Ѱt2 K1* C ٙd9P"|ӆUc x'aE;6tg|!vSKE30a` pYDC{p^"7WP u3 .Ѝ{Кgg(^!Uu0&inhq, ${<yYΪ֔u]N\kϘ4~B觕KnшHҜ#G^ҶFMu:p^e 3<gV)`WLHi+7%V#MÖ&{grxu7x\ h#:A rαXf|t:TjC;~QA;U1E *m+V+z8in|FP E[QUA24iaǡlloJv1> xc$J)q;SPya-ZtHuu> ~Ƀ,wZq}?dQtWwZսߘ?/,..%|xH+Jp.DQXsA!by?~,=5 ΉVr\C/SB%W22)00cB!^)9sd* f j6N;pr6XBIKZA%$eJQJs%k E| yB/sD?h2x*>7UJ3tZp`% 28WPX\:3_U6@wGrh@?t~?9}G%7 I+]gGHM<7;-jX1>Ud 8 >gBH@Wo\ijt@de9'r۸TTt&%>"⌰ vw2V"G~Id\rLGiB;hzL{>wuC7o ONm#vfUl8*)ֵCB5{t1*0r .OP9xګRn^7d]0w3#PtxaGǹٳy AAu@¬+N?vZRmgSo9 PTG!D÷uwZ @Œ[لD#xƝLPcwRΟPmߞ|'_$`W?5kn++w_~wEre=<^ʤZ0 M<A^$콂Cx@'Ϥ(ln#υΛc!utwRڽS.4 [j7-jD<Pv$Bk{ɓoן{`4gC3Wݗ[[+hwy衏|j{G٫fN'TO#$`xEQu3~0ٝu|8ZLyv5\A:BTsPn 7etn Q" }};H$FFAq&lE>P c-ҋϝ pfH3TCwzUb?ٝC IDAT0ARG]AĔ [b(<?r*M4ך ̰9 (w;ƀ3XrT䖠~*9? [4AY`Pe3vtmKiw ]`X2/v.2-g$ߋ/Q\6 (h B3ލ;ihov9'B%<R(zׯwWW1>976pαNp(rW6wOХk$(:oc/ =K'RO2QG6@9YcQhVt鲶cV4 hY۪9#S(]zVS)!oaR8#43pҝIQ wcpvAʂ߃m.~zO>|f?hf?MuFⅺmlܜ; 1ŢЫ]D1oCCzk$9jWo\$礎Nr1#إJQi35^*1ȽܔT"tJ)9L^Tfn"&BI(YϺB-;kER$G|cke+f&Puy;'`'48ODֱO/y-Z 6>yțN:vT ؛*D!hGA^vS/QzZRdۘ$ƙa?\X⧎hȸne1>IDp?fuBX83O;uX ޾̇OAoV1VNmpVؓ ]#j~f\JaLJ Z|c"IWHed\+G̺}ðx 6>Na/.zX|;~YuW@e?gm>Z8Ȏ~QȹYG7N8'jZ q&wY%yߧ_r!$/[hھT $Ih4)`@K@0"$GilG> .}n;D@daw/>~(68*្ RXTz7!ET֙~u=55nb"eD$VG(8])^T*)3B %%yf-Gyn0AG;ː-XnV3}f&1_t<Hر`;yRuXzGP4Y7q;U !;䂍 $t d ^G3h9؃gn/}/oNg{u=|օw? eW9ifrZж v5Pe&Hho0p+ NNʲ.(lba:Du<ټ"'hǪv͍vE b/`lr򓅙ix'sExfh(h ^̱=I/'6AJEY$gktQޯ;%"Kч}:7/U X \^X ammck(Z*dhOVP]hi!K-g'7ԕKdc衸B\ΨњO_tS~‰VTe%aW 0lelU0Q.S2.sDKN ϧHh2w vwSnTؽÞJ$-xvepz 4H|'z?8um#iDt[)͋_KbiQ]Cv`q#8;"%"w1m^P LΫc-.BUW.VՐW~ r( :Vڥm.UhwhI";Śym>Z>l7ro8TVZmMVq+E0SƬ'F=*EQSo9|ӾI+_ڼw_y<,(CErz#a]C֮JJK *%y|©cJUJYX^ 9zv403: -rI\8K):L&d눵Sh/R6 PVC{i??B`PX1o(A)R4—3&9O1|,%֢HN#[P~OUw'R?wX)ЊBph߀e>Gd_~*}Ѻv5ҨuNcǜU얝s@#{dNiU7X)?ALjѾރDbB(lei =F$fp[G "W\08ld$ F+?3"85dAvvz󠔒=2/q܆%?|lܣ* ) )N\7dɯfG2 89@=Ddz /'W\Y[+Oeb( 9#-_* $/T! [r- *=`D' \*+"AIHki^qͼ!'dΥT@zfw5WP9 WNʥnA]W|~௫8}{P;!oHY<ϣ i#^gOv|@óHMℑ[0,ژٷ#,QX\:\Ӿ{X&RKwwܯ,ZsYK9t֐pj̍:Á!]a9z1$yOp)gՅM,ܘOQmZZ]Z]9& Qgd5 Z,\! Ca1&JqFj6)D1Qܯ$ɾVxX.0sG4@ؿ40Cw/O/w0oKK'{CO?q\o%j#ٵ `|r@Jʒ?T5'ms n xL 5rDG !-x%VEB dk[WwCWT!LkYYHR7zDB}D 0FHS-i,}'1|".K^ģq{J}T}Z ꕧЋM'=nR?䡷|n0b]rn\cy80>]>z_$A"/mx=~mт:R]&y}} ;&vg>{R1:!frArW!ww/kS+e yDiv;AÈ$,c/<,/Lkqi\~QJ!IwUxW2j:2saq Ż¡CK@l?$z<Qt];'vÅR:冎cIŘbrH8QҊvy ]vvpIQM޿BU1l`0Ġêl "t: к@Ualni8] P}fb(Te ̔q!4Y!S4R]]ة ZyA8x^,swZd '/`+KHzޓ/ )х$m)Ġn\?@M註Ys6{KK'?s̙wM}hMeǚc"[V:z)#lH%:m9zQp5S^Ֆ*(-/ju 8*6iΟÇ Եۢl (6jSyju`:yHGUphLPʙN|Fț$<s P4W.|גH!fpKfN0ÁX;só!0ktJa3Y䆯#Ugɚ;gOȡEmgjt8(ZNNɊۺAπJX\^5;Ǖ8iɂj9DU)lqgeps׫nbD"<τ+;AIPBQTak $A30 n /\grYVbnu{ ;SHUN8O{ZĪ4>J!?9qc)^9[:9uЩ/|o}>uV5^)ALLPaqE>2ΤzT=]L%Z)aO 6u 8;tm$j"*_E&v4\(|s"Wժˆ6C09 HT$ωPJGiS~ҌZS¬6~b7I6\&Sd$ rm#FPG =AB] tu#`ٚU -!6zSffv?.'Hy&N19 BmjWE{v:__'}xi"2Ϛ| n D} F(l@^EHMU0$?ok Q5W ~q"2`SDwHFu3/;hŻZ 5Af%y+;_w/Qf BP5~.a<#н%!dACֲ8Md,w`}:W MV SSY$ʆ 9\ ~K e.=AW!ISANu~vlΈZyu(4@L+~\n7=('ߠAe礚#,y\:Y LϬI4 WEq<0 }]9&t'G/~>W5:kSɮ*hSU(AgyqFhI^ 8K-PcRf}%b(Z.J·ENg΢ҰOghk@i.B^Pe0 7m|sq^mN2\AsiΠêEԺ|Iܻcyxѕv Rtq@v,^Ix3gu{W8Ṣh1Ѧl F9Ts#f\ڶ` ֠Z$RA_}S `b.w 15Mx\[[<Ӻ@E=AIz"";((ص;r0(XU.釵JGFΩaS)7Ta|qV76Lctpz0H\'@R)wW!ULi%zXPK / ]bmnOq^Ҽib eK[͍|_=Ed~>49#<Tf-aEpxK=0N)B=yW6.LI^q2uU `O%&`ks?o~⁳ЪU+BQU1% cȅ-D &؎Nw19^ZxmBTC8^cUwp0u6p0ش*V5f,;iWFKYޗAj;Kv)4R=ŗ u:35W ?c`)}']S#`eU"Z>niV̷CS}~(d5,DurJiE [a1)^z\YKim%N1<7{+ R](fm EA ڇ:Gڙ<\Nڛ=:hD4pwՠmhYP-W>ǣYwtdRR W:$HxkAz67o W€Ƙ  NOd[[+w7o?:EdPH@!1et+ulFSM'ܣ-IzpU$+[(5EJk*ʢ8ϛ{gV_j_ƗW0FI.P7bkxFISzgRT`r;=9&\8s4`BQĶ$49G*trcF+ΤD뭾0?\+W7Րg/mbG\7=+x8QY :i.~SY+au Dy Jt~$+jeʭǾ?ӧnIA-D.$Q 2_{UUdQui(vͽvi?gUY"CcUUz@m]Jq~7*7n-ܼy'ZzC[^>EjQK;{:I[I:3z<$"?&BFBajj$l2;L^yZ pCdKCyk]ݶwIvIvPlls/޸qzo<.QqfVJǷ*//OŠMI0Llst%>͖n޸rͺSX2dm ӽeHظZ_yʕyO{[<Yo! XQJWB1f)GJJ8;/$Mҟ%<kEIoEGK8ɋ7XJxұf9CWOɅӰz[kܹGODO 9b?I3\v.^}ƍ5=x|՞O Sդ;)j-b4m}U1w:G]QIDATU=TU/ = -T- jP:[ﭿPU TWqk]rjujر;P-h-v7^K{=tᨽxhgèy\-ɻ钚\Ѩ>P䄝A mS]Irr!K߿oGnF}|S]zPkE>++Vwn~~S::mQaD~N(O#RivȿVQ>j=ۼP ؇Up M5l`յÍ .:\6[瀗 ֚~rux N^̱zf*҅v1/;= ǢTHa2Q#3y"nxCGo=:⒃ ]Edo vo||'!)$n%$Ivz,\sW>}헨_M/48w, vl0aVtn|Jc8衪zj0T[]_7%/;AbO棌յk˧˧tՅ49uEgY%vjҌxSM` %߄j n2]å>ˌ S>\h!fJM{U//5`w@/݂}M2fHu=\Sdmի^{@:CsBu}W%2EqDK20aaσz] T5쩪a0{sU{~ .̑kH7I\-ᜪ˗~9rMNxs%5ˑg :wP'"L${%qpFy3SctxS.@c%fKGЇG]ǿUmvtĒ{"2ʘj]%ks7o^xKw77oZV{BR.c 77;(cƄ&FO^ʚZd`q{xi0xϒ_f{w*h4f@/x=|:Jt(-%XvlQ_b n4;ו{  A? r%$xQIV1dzd%`pG$7Oj;3+8IgsxS5mny֭/ܽs-KtssvtQ*-)ghUM#k"]׃AU{Uu[Zyjx/m"5 仒&ⱍgBrJr1I@Rqٓ.>b;s~FI %}|sN9BL4B{66o?\j;ᵄ'go7|Nt }W\W[[K7o^ݞSݹssh-[m]eA/䣋Q9ıg圌*Sb53Eytvclgŕ_hm7 M4q`2Q%IM]fSީ3ZGA-egliU8\|QsEHYkcZcíukMlkA]ydw}+'&(_olܮO]r#}/Vwq2Ĉ[.yǓ0Uf6B5(|-epdCcR}G 䔀]Bc!2PnK3]pם[[wWEd&`F=ݴ?`c1 <(ni]-J],cu=2wڹǁ>g#`_]xOyǃyDY_Z%OqS&)Qώg]NAnOTwJu^a;eȥ]e<>غM\f́vkz߾~75{Δa&8>I#5wAڡ@VB=`K_\SnɁ@?i= QvXe~+Sr7"У_P[ָy.>+ɇͤs<90%l5 W_+znk㉤GT{%7د8cک3n1$׸IR. c#{N&or5;soZxtmkkVW:ydfl(}QiWXc|]9d 'QLA"qp}/d f T9ÞzozωEv36X?in@?+z`fX Г< `9\^>ys e9~枇u=.! Hi;x͕2xYG ;# xHMڋ}\>kSՕ裿;_اpM[o'ѧ}'\n瀖v L_\\<{啧N:'Ά,*r& ͬY,MDÙz.$9ɿKZh93G@o%H(U>)GAj{k'>FDeW sztTRް8DodFUۗNw{{WI`GPEg#i 6|!4`M]1U7)`BE>IV${4@fViT4zC˧^'O< )+K/4\1jn^)#y#P/=go1 1nrJx?햖OC.ޟNU?gU]v?>hm| $t  G^z#ǎ?Bsp("ߓbz7H$ޏ"!,ϼDM A!Sv-ΞW%STᖺs;rΥAd_5JYK|=1Lڞ4CiΝ$ѧQJ嵪WܝJ&}+*[SylYE`ۘwH"@Yt^ 81#z.!ݭ MVQ ;T;33[8u/O|}4j=0=Лmw8| Ve~[n[X\uV {xSަ'r@9I,I6gӕuUR[< *zY}Aqz_+\n>nN4[}ܱYPWCDu߫Th8Zvn?͹'OlAJQ$Dm6Uȣ$ϳI/jf TO$Ho#9\RTޜb,.7`]ݺy?ܺot޴?;[ &YJi$`Nv36Uջ;=tuO?K/hN~qBP +_B>W<eA9T`NՏHq6F2C`W=껧uܸ իؿJ{i;M~9~l>t|5vYKq 6|?bЉKNڭ9Њn9 %vvABz+fU8s#UaMA2|iW 7 PuZ/̒v%YkW.?q歋Wnz^oGhȸmfo8O{{?-P}d5mrMi>$^|= ,jZ)=(Z?|ÇС'N-,+ss˥օ(ġfߨVZokkz;][~ec  †f}pTxu)~kNd[ )o!` rm8`o7{?h6Zeh=Seb, *T.3mm`+u=\UJU`nU Z{j@z@{mvylZ)?^ylcm\G`<#~q wЛT(\ֺ(kMMd1N~q8i K&=Äen޴y}QE ǑSٳL+^ALsI2 74>n$swq1հvmZ{):kc YIqۻN۞LR=W7|݂T-l m,`?-wrl~ڿn{ z-]2 i7'vLƯk8pxXGd ~mz$?.J\7 %7-'@l9JY~V;ciOθiHq#ޤJe;?f1`ܼ~#p`z~'2*zH>&V<_kT9@X )|ұqMz|i^@ hKmDh9~5ci[`bٹ[o˱i~ݴSIo4N﹟D? ks4KWM׫~@O]pNC*FzKqIoD~@/M^Oݴ3Aw@ob[]- 'z;iigMh,}Nm7ݱIM?st\?*v696i{ұ9: O.ګtc4?tbv˴>n{7R| :119`{Uw#:唫L{etjz`yMPF@?H|}=hM 8^ɱچ~@Ic4%ƑVd7 3$j<>^%gH@?sMgylhtv*ugufD@?Yn@|W~@ kuFh7]\N~@~_Gt h/4ͰMG?X-CIENDB`globs-0.2.0~svn50/ui/0000775000175000017500000000000011516033442013621 5ustar takakitakakiglobs-0.2.0~svn50/ui/hwd_win.ui0000664000175000017500000000462611516033401015622 0ustar takakitakaki True Detected Hardware 420 200 True True 130 True True automatic automatic True True True False True True True automatic automatic True True True True True globs-0.2.0~svn50/ui/about_dlg.ui0000664000175000017500000000471111516033401016116 0ustar takakitakaki True 5 normal False GL O.B.S. Copyright (C) 2006-2007 by Angelo "Encelo" Theodorou GL Open Benchmark Suite http://globs.sourceforge.net http://globs.sourceforge.net This program is free software; you can redistribute it and or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Angelo "Encelo" Theodorou <encelo@users.sourceforge.net> translator-credits True True vertical 2 True end False end 0 globs-0.2.0~svn50/ui/pref_win.ui0000664000175000017500000002257211516033401015774 0ustar takakitakaki True Preferences 400 230 True vertical True True True 6 2 True User: True Password: 1 2 True Name: 2 3 True Location: 3 4 True Email: 4 5 True Homesite: 5 6 True True 1 2 True True False 1 2 1 2 True True 1 2 2 3 True True 1 2 3 4 True True 1 2 4 5 True True 1 2 5 6 True User False 0 True gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 1 globs-0.2.0~svn50/ui/main_win.ui0000664000175000017500000007655211516033401015773 0ustar takakitakaki True GL O.B.S. 400 550 True vertical True True _File True True _Detected HW True Open the Detected Hardware window True hd_image False True gtk-preferences True True True True gtk-quit True True True True _Database True True Show _Local True Open the local database browsing window True disconnect_image False _Purge True Purge entries not related to available benchmarks True delete_image False _Clear True Clear the whole local database clear_image False D_ump True Dump the local database in a text file True save-as_image False True Show _Remote True Open the browser on the remote database browsing page True connect_image False True _Help True True gtk-help True Open the browser on the online help page True True gtk-about True True True False 0 True True vertical 250 True True True automatic automatic True True True False True True True True 0 none True 12 True True automatic automatic True True False word info_buffer True Information False True vertical True 0 none True 12 True vertical True True Resolution: False 2 0 True 2 1 0 True True True Width: 0 True True width_adjustment True 1 0 True True Height: 0 True True height_adjustment True 1 1 1 True True True Time: 0 True True time_adjustment True 1 0 True True Repeat: 0 True True repeat_adjustment True 1 1 2 Fullscreen True True False True 3 0 Lock current True True False True 1 1 True Options 1 False True vertical 2 True Statistics 2 False True True 1 Execute True True True Execute the selected benchmark execute_image False 2 True 2 False 3 True gtk-harddisk True gtk-disconnect True gtk-delete True gtk-save-as True gtk-connect 4196 1 10 5 1 120 1 10 1 100 1 10 True gtk-execute True gtk-clear 4196 1 10 globs-0.2.0~svn50/ui/local_db_win.ui0000664000175000017500000001224011516033401016566 0ustar takakitakaki True gtk-delete True gtk-connect True Local Database 640 480 True vertical True True automatic automatic True True True 0 True Submit Entry True True True Submit the selected entry to the remote database connect_image False False 0 Delete Entry True True True Delete the selected entry delete_image False False 1 gtk-refresh True True True Refresh the list reading again from the local database True False False 2 gtk-close True True True True False False 3 False 1 globs-0.2.0~svn50/po/0000775000175000017500000000000011516033442013622 5ustar takakitakakiglobs-0.2.0~svn50/po/SConstruct0000664000175000017500000000301111516033401015642 0ustar takakitakakiimport os, SCons # import variables try: Import('locale_dir') except SCons.Errors.UserError: # Install directory root = ARGUMENTS.get('root', '/') prefix = ARGUMENTS.get('prefix', 'usr/local') if root != '' and prefix != '': # not defaults if prefix[0] == '/': prefix = prefix[1:] locale_dir = os.path.join(root, prefix, 'share/locale') # create environment env = Environment() pkg = 'globs' langs = ('it', 'de', 'tr', 'fr', 'es', 'sv') # defining helpers and builders def pot_helper(): args = [ 'intltool-update', '--pot', '--gettext-package=' + pkg] print 'Updating ' + pkg + '.pot' return os.spawnvp(os.P_WAIT, 'intltool-update', args) def po_helper(po, pot): args = ['msgmerge', '--update', po, pot] print 'Updating ' + po return os.spawnvp(os.P_WAIT, 'msgmerge', args) def mo_builder(target, source, env): potfile = os.path.join(os.path.dirname(os.path.dirname(source[0].get_path())), pkg + '.pot') po_helper(source[0].get_path(), potfile) args = ['msgfmt', '-c', '-o', target[0].get_path(), source[0].get_path()] return os.spawnvp(os.P_WAIT, 'msgfmt', args) mo_bld = Builder(action = mo_builder) env.Append (BUILDERS = {'MoBuild' : mo_bld}) # print building message if not env.GetOption('clean'): print ":: Building binary message catalogs" pot_helper() for x in langs: catalog = env.MoBuild(os.path.join(x, 'LC_MESSAGES/%s.mo' % pkg), os.path.join(x, x + '.po')) # Install if locale_dir != '': dest = os.path.join(locale_dir, x, 'LC_MESSAGES') env.Install(dest, catalog) env.Alias('install', dest) globs-0.2.0~svn50/po/de/0000775000175000017500000000000011516033442014212 5ustar takakitakakiglobs-0.2.0~svn50/po/de/de.po0000664000175000017500000002732611516033401015147 0ustar takakitakaki# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-15 02:52+0200\n" "PO-Revision-Date: 2006-04-07 13:02+0100\n" "Last-Translator: Tobias Tost \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: ../globs.glade.h:1 msgid "Cancel" msgstr "Abbrechen" #: ../globs.glade.h:2 msgid "Clear the whole local database" msgstr "Leere die lokale Datenbank" #: ../globs.glade.h:3 msgid "Close" msgstr "Schlieen" #: ../globs.glade.h:4 #, fuzzy msgid "D_ump" msgstr "lokal speichern" #: ../globs.glade.h:5 msgid "Delete Entry" msgstr "Eintrag lschen" #: ../globs.glade.h:6 msgid "Delete the selected entry" msgstr "Lsche den gewhlten Eintrag" #: ../globs.glade.h:7 msgid "Detected Hardware" msgstr "Erkannte Hardware" #: ../globs.glade.h:8 msgid "Dump the local database in a text file" msgstr "Speichere die lokale Datenbank in eine Textdatei" #: ../globs.glade.h:9 msgid "Email:" msgstr "Email:" #: ../globs.glade.h:10 msgid "Execute" msgstr "Ausfhren" #: ../globs.glade.h:11 msgid "Execute the selected benchmark" msgstr "Ausgewhlte Benchmarks ausfhren" #: ../globs.glade.h:12 ../src/Globs/local_db_win.py:97 msgid "Fullscreen" msgstr "Vollbild" #: ../globs.glade.h:13 msgid "GL Open Benchmark Suite" msgstr "GL Open Benchmark Suite" #: ../globs.glade.h:14 #, fuzzy msgid "Height:" msgstr "Hhe" #: ../globs.glade.h:15 msgid "Homesite:" msgstr "Homepage:" #: ../globs.glade.h:16 msgid "Information" msgstr "Information" #: ../globs.glade.h:17 msgid "Local Database" msgstr "Lokale Datenbank" #: ../globs.glade.h:18 msgid "Location:" msgstr "Ort:" #: ../globs.glade.h:19 msgid "Lock current" msgstr "Blockiere aktuelles Ergebnis" #: ../globs.glade.h:20 ../src/Globs/main_win.py:99 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Name:" #: ../globs.glade.h:21 msgid "OK" msgstr "OK" #: ../globs.glade.h:22 msgid "Open the Detected Hardware window" msgstr "ffne das Fenster fr erkannte Hardware" #: ../globs.glade.h:23 msgid "Open the browser on the online help page" msgstr "" #: ../globs.glade.h:24 #, fuzzy msgid "Open the browser on the remote database browsing page" msgstr "ffne das Fenster mit Ergebnissen der Online-Datenbank" #: ../globs.glade.h:25 msgid "Open the local database browsing window" msgstr "ffne das Fenster, um in der lokalen Datenbank zu stbern" #: ../globs.glade.h:26 msgid "Options" msgstr "Optionen" #: ../globs.glade.h:27 msgid "Password:" msgstr "Password:" #: ../globs.glade.h:28 msgid "Preferences" msgstr "Einstellungen" #: ../globs.glade.h:29 msgid "Purge entries not related to available benchmarks" msgstr "Bereinige die Eintrge um nicht vorhandene Benchmarks" #: ../globs.glade.h:30 msgid "Refresh list contents reading again from the local database" msgstr "Frishe den Listeninhalt mit Ergebnissen aus der lokalen Datenbank auf" #: ../globs.glade.h:31 msgid "Repeat:" msgstr "" #: ../globs.glade.h:32 #, fuzzy msgid "Resolution:" msgstr "Version:" #: ../globs.glade.h:33 msgid "Show _Local" msgstr "Zeige _Lokale DB" #: ../globs.glade.h:34 msgid "Show _Remote" msgstr "Zeige _Online DB" #: ../globs.glade.h:35 msgid "Statistics" msgstr "Statistik" #: ../globs.glade.h:36 msgid "Submit Entry" msgstr "Sende Eintrag" #: ../globs.glade.h:37 msgid "Submit the selected entry to the remote database" msgstr "Sendet den ausgewhlten Eintrag an die Online-Datenbank" #: ../globs.glade.h:38 msgid "Time:" msgstr "Zeit:" #: ../globs.glade.h:39 msgid "Update" msgstr "Update" #: ../globs.glade.h:40 msgid "User" msgstr "User" #: ../globs.glade.h:41 msgid "User:" msgstr "User:" #: ../globs.glade.h:42 msgid "Width:" msgstr "Breite:" #: ../globs.glade.h:43 #, fuzzy msgid "_Clear" msgstr "Leeren" #: ../globs.glade.h:44 msgid "_Database" msgstr "_Datenbank" #: ../globs.glade.h:45 msgid "_Detected HW" msgstr "_Erkannte HW" #: ../globs.glade.h:46 msgid "_File" msgstr "_Datei" #: ../globs.glade.h:47 msgid "_Help" msgstr "_Hilfe" #: ../globs.glade.h:48 #, fuzzy msgid "_Purge" msgstr "Reinigen" #: ../globs.glade.h:49 msgid "translator-credits" msgstr "Tobias \"Hephaesteus\" Tost (Deutsch)" #: ../src/Globs/benchmarks.py:78 ../src/Globs/benchmarks.py:91 #: ../src/Globs/benchmarks.py:109 ../src/Globs/benchmarks.py:139 #: ../src/Globs/benchmarks.py:159 ../src/Globs/benchmarks.py:197 #: ../src/Globs/main_win.py:192 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "Existiert nicht!" #: ../src/Globs/benchmarks.py:88 msgid "opts_str() needs at least one argument!" msgstr "opts_str() bentigt wenigstens ein Argument!" #: ../src/Globs/benchmarks.py:150 #, python-format msgid "OpenGL extension %s is missing!" msgstr "" #: ../src/Globs/benchmarks.py:188 #, fuzzy msgid "Could not parse benchmark output" msgstr "Kann Benchmark-Output nicht auflsen: %s" #: ../src/Globs/db.py:35 msgid "Creating" msgstr "Erstelle" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:100 ../src/Globs/main_win.py:102 #: ../src/Globs/main_win.py:104 ../src/Globs/stats_area.py:117 #: ../src/Globs/stats_area.py:120 ../src/Globs/stats_area.py:123 #: ../src/Globs/stats_area.py:143 ../src/Globs/stats_area.py:150 #: ../src/Globs/stats_area.py:157 msgid "N/A" msgstr "k/A" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:115 msgid "General" msgstr "" #. Single CPU #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:119 #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:121 #: ../src/Globs/hwd_win.py:125 ../src/Globs/hwd_win.py:126 #: ../src/Globs/hwd_win.py:127 ../src/Globs/hwd_win.py:128 msgid "Processor" msgstr "" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:134 #: ../src/Globs/hwd_win.py:135 #, fuzzy msgid "Memory" msgstr "Arbeitsspeicher" #. Columns #: ../src/Globs/hwd_win.py:62 msgid "Category" msgstr "" #. Columns #: ../src/Globs/hwd_win.py:82 msgid "Attribute" msgstr "" #: ../src/Globs/hwd_win.py:89 msgid "Value" msgstr "" #: ../src/Globs/hwd_win.py:115 #, fuzzy msgid "Hostname" msgstr "Hostname:" #: ../src/Globs/hwd_win.py:119 ../src/Globs/hwd_win.py:126 #, fuzzy msgid "Model" msgstr "Modell:" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 #, fuzzy msgid "Frequency" msgstr "Taktrate:" #: ../src/Globs/hwd_win.py:125 msgid "CPU" msgstr "" #: ../src/Globs/hwd_win.py:130 msgid "Vendor" msgstr "" #: ../src/Globs/hwd_win.py:131 #, fuzzy msgid "Renderer" msgstr "Renderer:" #: ../src/Globs/hwd_win.py:132 ../src/Globs/local_db_win.py:69 #: ../src/Globs/main_win.py:131 msgid "Version" msgstr "Version" #: ../src/Globs/hwd_win.py:134 msgid "Physical" msgstr "" #: ../src/Globs/hwd_win.py:135 msgid "Swap" msgstr "" #: ../src/Globs/local_db.py:34 #, fuzzy msgid "Benchmarks table exists already" msgstr "Benchmark-Tabelle existiert bereits." #. Columns #: ../src/Globs/local_db_win.py:62 ../src/Globs/main_win.py:124 msgid "Name" msgstr "Name" #: ../src/Globs/local_db_win.py:76 msgid "FPS" msgstr "FPS" #: ../src/Globs/local_db_win.py:83 msgid "Width" msgstr "Breite" #: ../src/Globs/local_db_win.py:90 msgid "Height" msgstr "Hhe" #: ../src/Globs/local_db_win.py:104 msgid "Time" msgstr "Zeit" #: ../src/Globs/local_db_win.py:111 msgid "Date" msgstr "Datum" #: ../src/Globs/local_db_win.py:147 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" #: ../src/Globs/local_db_win.py:159 #, fuzzy msgid "Do you really want to submit the selected entries?" msgstr "Wollen Sie wirklich die Datenbank bereinigen?" #: ../src/Globs/local_db_win.py:176 #, fuzzy msgid "Error in the connection!" msgstr "Whrend der Verbindung ist ein Fehler aufgetreten!\n" #: ../src/Globs/local_db_win.py:179 msgid "Malformed URL sent!" msgstr "" #: ../src/Globs/local_db_win.py:182 #, fuzzy msgid "Cannot connect to the remote database!" msgstr "Sendet den ausgewhlten Eintrag an die Online-Datenbank" #: ../src/Globs/local_db_win.py:185 msgid "The remote database cannot be selected!" msgstr "" #: ../src/Globs/local_db_win.py:188 msgid "Wrong password!" msgstr "" #: ../src/Globs/local_db_win.py:192 msgid " not updated\n" msgstr "" #: ../src/Globs/local_db_win.py:196 #, fuzzy msgid " updated\n" msgstr "Update" #: ../src/Globs/local_db_win.py:198 ../src/Globs/local_db_win.py:201 #: ../src/Globs/local_db_win.py:204 msgid " inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:200 msgid "New machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:203 msgid "New user and new machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:222 #, fuzzy msgid "Do you really want to delete the selected entries?" msgstr "Wollen Sie die Datenbank wirklich leeren?" #: ../src/Globs/main_win.py:101 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Autor:" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Beschreibung:" #: ../src/Globs/main_win.py:138 #, fuzzy msgid "Best FPS" msgstr "Bestes:" #: ../src/Globs/main_win.py:157 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:265 msgid "Do you really want to purge the database?" msgstr "Wollen Sie wirklich die Datenbank bereinigen?" #: ../src/Globs/main_win.py:274 #, fuzzy msgid "Database purged" msgstr "_Datenbank" #: ../src/Globs/main_win.py:281 msgid "Do you really want to clear the database?" msgstr "Wollen Sie die Datenbank wirklich leeren?" #: ../src/Globs/main_win.py:290 #, fuzzy msgid "Database cleared" msgstr "_Datenbank" #: ../src/Globs/main_win.py:310 msgid "Database saved as " msgstr "" #: ../src/Globs/main_win.py:385 #, fuzzy msgid "Do you really want to execute the selected benchmarks?" msgstr "Wollen Sie wirklich alle verfgbaren Benchmarks durchfhren?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "" #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 #, fuzzy msgid " executed at " msgstr "Ausfhren" #: ../src/Globs/stats_area.py:109 #, fuzzy msgid "Best FPS:" msgstr "Bestes:" #: ../src/Globs/stats_area.py:110 #, fuzzy msgid "Last FPS:" msgstr "Letztes:" #: ../src/Globs/stats_area.py:111 #, fuzzy msgid "Worst FPS:" msgstr "Schlechtestes:" #: ../src/Globs/submit.py:91 msgid "One or more compelling parameter is None!" msgstr "" #: ../src/Globs/submit.py:102 #, fuzzy msgid "An error occurred during the connection!\n" msgstr "Whrend der Verbindung ist ein Fehler aufgetreten!\n" #: ../src/Globs/user.py:34 #, fuzzy msgid "User table exists already" msgstr "Benutzer-Tabelle existiert bereits." #: ../src/Globs/user.py:74 msgid "No value provided for user name or password!" msgstr "" #, fuzzy #~ msgid "OpenGL " #~ msgstr "OpenGL" #, fuzzy #~ msgid "Heigth:" #~ msgstr "Hhe:" #~ msgid "Execute All" #~ msgstr "Alle Ausfhren" #~ msgid "Execute all the available benchmarks" #~ msgstr "Alle verfgbaren Benchmarks ausfhren" #, fuzzy #~ msgid "Submit All" #~ msgstr "Sende Eintrag" #, fuzzy #~ msgid "Submit all the entries in the local database" #~ msgstr "Sendet den ausgewhlten Eintrag an die Online-Datenbank" #, fuzzy #~ msgid "All the local database entries have been submitted" #~ msgstr "Speichere die lokale Datenbank in eine Textdatei" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "BogoMIPS:" #~ msgstr "BogoMIPS:" #~ msgid "Total:" #~ msgstr "Total:" #~ msgid "_About" #~ msgstr "_ber" globs-0.2.0~svn50/po/tr/0000775000175000017500000000000011516033442014247 5ustar takakitakakiglobs-0.2.0~svn50/po/tr/tr.po0000664000175000017500000003024111516033401015227 0ustar takakitakaki# translation of globs.pot to Turkish. # This file is distributed under the same license as GL Open Benchmark Suite. # Muhammet Kara , 2006. # msgid "" msgstr "" "Project-Id-Version: globs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-15 02:52+0200\n" "PO-Revision-Date: 2006-11-03 11:20+0200\n" "Last-Translator: Muhammet Kara \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Turkish\n" #: ../globs.glade.h:1 msgid "Cancel" msgstr "Vazgeç" #: ../globs.glade.h:2 msgid "Clear the whole local database" msgstr "Yerel veri tabanının tamamını sil" #: ../globs.glade.h:3 msgid "Close" msgstr "Kapat" #: ../globs.glade.h:4 #, fuzzy msgid "D_ump" msgstr "Boşalt" #: ../globs.glade.h:5 msgid "Delete Entry" msgstr "Girdiyi Sil" #: ../globs.glade.h:6 msgid "Delete the selected entry" msgstr "Seçilen girdiyi sil" #: ../globs.glade.h:7 msgid "Detected Hardware" msgstr "Bulunan Donanım" #: ../globs.glade.h:8 msgid "Dump the local database in a text file" msgstr "Yerel veri tabanını bir metin dosyasına boşalt" #: ../globs.glade.h:9 msgid "Email:" msgstr "E-posta:" #: ../globs.glade.h:10 msgid "Execute" msgstr "Yürüt" #: ../globs.glade.h:11 msgid "Execute the selected benchmark" msgstr "Seçilen değerlendirmeyi yürüt" #: ../globs.glade.h:12 ../src/Globs/local_db_win.py:97 msgid "Fullscreen" msgstr "Tam Ekran" #: ../globs.glade.h:13 msgid "GL Open Benchmark Suite" msgstr "GL Açık Kaynak Kodlu Değerlendirme Paketi" #: ../globs.glade.h:14 #, fuzzy msgid "Height:" msgstr "Yükseklik" #: ../globs.glade.h:15 msgid "Homesite:" msgstr "Ev Sayfası:" #: ../globs.glade.h:16 msgid "Information" msgstr "Bilgi" #: ../globs.glade.h:17 msgid "Local Database" msgstr "Yerel Veri Tabanı" #: ../globs.glade.h:18 msgid "Location:" msgstr "Konum:" #: ../globs.glade.h:19 msgid "Lock current" msgstr "Şu ankini kilitle" #: ../globs.glade.h:20 ../src/Globs/main_win.py:99 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Ad:" #: ../globs.glade.h:21 msgid "OK" msgstr "TAMAM" #: ../globs.glade.h:22 msgid "Open the Detected Hardware window" msgstr "Bulunan Donanım penceresini Aç" #: ../globs.glade.h:23 msgid "Open the browser on the online help page" msgstr "Tarayıcıyı çevrimiçi yardım sayfasında aç" #: ../globs.glade.h:24 msgid "Open the browser on the remote database browsing page" msgstr "Tarayıcıyı uzak veri tabanı gezinim sayfasında aç" #: ../globs.glade.h:25 msgid "Open the local database browsing window" msgstr "Yerel veri tabanı gezinim penceresini aç" #: ../globs.glade.h:26 msgid "Options" msgstr "Seçenekler" #: ../globs.glade.h:27 msgid "Password:" msgstr "Parola:" #: ../globs.glade.h:28 msgid "Preferences" msgstr "Tercihler" #: ../globs.glade.h:29 msgid "Purge entries not related to available benchmarks" msgstr "Kullanılabilir değerlendirmelerle ilgili olmayan girdileri temizle" #: ../globs.glade.h:30 msgid "Refresh list contents reading again from the local database" msgstr "Liste içeriğini yerel veri tabanından tekrar okuyarak tazele" #: ../globs.glade.h:31 msgid "Repeat:" msgstr "Yinele:" #: ../globs.glade.h:32 #, fuzzy msgid "Resolution:" msgstr "Tanım:" #: ../globs.glade.h:33 msgid "Show _Local" msgstr "Yereli _Göster" #: ../globs.glade.h:34 msgid "Show _Remote" msgstr "_Uzağı Göster" #: ../globs.glade.h:35 msgid "Statistics" msgstr "İstatistikler" #: ../globs.glade.h:36 msgid "Submit Entry" msgstr "Girdiyi Gönder" #: ../globs.glade.h:37 msgid "Submit the selected entry to the remote database" msgstr "Seçilen girdiyi uzak veri tabanına gönder" #: ../globs.glade.h:38 msgid "Time:" msgstr "Zaman:" #: ../globs.glade.h:39 msgid "Update" msgstr "Güncelle" #: ../globs.glade.h:40 msgid "User" msgstr "Kullanıcı" #: ../globs.glade.h:41 msgid "User:" msgstr "Kullanıcı:" #: ../globs.glade.h:42 msgid "Width:" msgstr "Genişlik:" #: ../globs.glade.h:43 #, fuzzy msgid "_Clear" msgstr "Temizle" #: ../globs.glade.h:44 msgid "_Database" msgstr "_Veri Tabanı" #: ../globs.glade.h:45 msgid "_Detected HW" msgstr "_Bulunan Donanım" #: ../globs.glade.h:46 msgid "_File" msgstr "_Dosya" #: ../globs.glade.h:47 msgid "_Help" msgstr "_Yardım" #: ../globs.glade.h:48 #, fuzzy msgid "_Purge" msgstr "Temizle" #: ../globs.glade.h:49 msgid "translator-credits" msgstr "Muhammet Kara " #: ../src/Globs/benchmarks.py:78 ../src/Globs/benchmarks.py:91 #: ../src/Globs/benchmarks.py:109 ../src/Globs/benchmarks.py:139 #: ../src/Globs/benchmarks.py:159 ../src/Globs/benchmarks.py:197 #: ../src/Globs/main_win.py:192 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "yok!" #: ../src/Globs/benchmarks.py:88 msgid "opts_str() needs at least one argument!" msgstr "opts_str() en azından bir argümana ihtiyaç duyar!" #: ../src/Globs/benchmarks.py:150 #, python-format msgid "OpenGL extension %s is missing!" msgstr "OpenGL uzantısı %s eksik!" #: ../src/Globs/benchmarks.py:188 msgid "Could not parse benchmark output" msgstr "Değerlendirme çıktısı ayrıştırılamadı" #: ../src/Globs/db.py:35 msgid "Creating" msgstr "Oluşturuluyor" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:100 ../src/Globs/main_win.py:102 #: ../src/Globs/main_win.py:104 ../src/Globs/stats_area.py:117 #: ../src/Globs/stats_area.py:120 ../src/Globs/stats_area.py:123 #: ../src/Globs/stats_area.py:143 ../src/Globs/stats_area.py:150 #: ../src/Globs/stats_area.py:157 msgid "N/A" msgstr "N/A" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:115 msgid "General" msgstr "Genel" #. Single CPU #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:119 #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:121 #: ../src/Globs/hwd_win.py:125 ../src/Globs/hwd_win.py:126 #: ../src/Globs/hwd_win.py:127 ../src/Globs/hwd_win.py:128 msgid "Processor" msgstr "İşlemci" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:134 #: ../src/Globs/hwd_win.py:135 msgid "Memory" msgstr "Hafıza" #. Columns #: ../src/Globs/hwd_win.py:62 msgid "Category" msgstr "Kategori" #. Columns #: ../src/Globs/hwd_win.py:82 msgid "Attribute" msgstr "Özellik" #: ../src/Globs/hwd_win.py:89 msgid "Value" msgstr "Değer" #: ../src/Globs/hwd_win.py:115 msgid "Hostname" msgstr "Makine Adı" #: ../src/Globs/hwd_win.py:119 ../src/Globs/hwd_win.py:126 msgid "Model" msgstr "Model" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Frequency" msgstr "Frekans" #: ../src/Globs/hwd_win.py:125 msgid "CPU" msgstr "CPU" #: ../src/Globs/hwd_win.py:130 msgid "Vendor" msgstr "Satıcı" #: ../src/Globs/hwd_win.py:131 msgid "Renderer" msgstr "Sunucu" #: ../src/Globs/hwd_win.py:132 ../src/Globs/local_db_win.py:69 #: ../src/Globs/main_win.py:131 msgid "Version" msgstr "Sürüm" #: ../src/Globs/hwd_win.py:134 msgid "Physical" msgstr "Fiziksel" #: ../src/Globs/hwd_win.py:135 msgid "Swap" msgstr "Takas" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "Değerlendirmeler tablosu zaten var" #. Columns #: ../src/Globs/local_db_win.py:62 ../src/Globs/main_win.py:124 msgid "Name" msgstr "Ad" #: ../src/Globs/local_db_win.py:76 msgid "FPS" msgstr "FPS" #: ../src/Globs/local_db_win.py:83 msgid "Width" msgstr "Genişlik" #: ../src/Globs/local_db_win.py:90 msgid "Height" msgstr "Yükseklik" #: ../src/Globs/local_db_win.py:104 msgid "Time" msgstr "Zaman" #: ../src/Globs/local_db_win.py:111 msgid "Date" msgstr "Tarih" #: ../src/Globs/local_db_win.py:147 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" "Tercihler penceresinin Kullanıcı sekmesinde bir kullanıcı adı ve bir parola " "sağlamalısınız." #: ../src/Globs/local_db_win.py:159 #, fuzzy msgid "Do you really want to submit the selected entries?" msgstr "Gerçekten veri tabanını temizlemek istiyor musunuz?" #: ../src/Globs/local_db_win.py:176 #, fuzzy msgid "Error in the connection!" msgstr "Bağlantı sırasında bir hata oluştu!\n" #: ../src/Globs/local_db_win.py:179 msgid "Malformed URL sent!" msgstr "" #: ../src/Globs/local_db_win.py:182 #, fuzzy msgid "Cannot connect to the remote database!" msgstr "Seçilen girdiyi uzak veri tabanına gönder" #: ../src/Globs/local_db_win.py:185 msgid "The remote database cannot be selected!" msgstr "" #: ../src/Globs/local_db_win.py:188 msgid "Wrong password!" msgstr "" #: ../src/Globs/local_db_win.py:192 msgid " not updated\n" msgstr "" #: ../src/Globs/local_db_win.py:196 #, fuzzy msgid " updated\n" msgstr "Güncelle" #: ../src/Globs/local_db_win.py:198 ../src/Globs/local_db_win.py:201 #: ../src/Globs/local_db_win.py:204 msgid " inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:200 msgid "New machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:203 msgid "New user and new machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:222 #, fuzzy msgid "Do you really want to delete the selected entries?" msgstr "Gerçekten veri tabanını silmek istiyor musunuz?" #: ../src/Globs/main_win.py:101 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Yazar:" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Tanım:" #: ../src/Globs/main_win.py:138 msgid "Best FPS" msgstr "En İyi FPS" #: ../src/Globs/main_win.py:157 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:265 msgid "Do you really want to purge the database?" msgstr "Gerçekten veri tabanını temizlemek istiyor musunuz?" #: ../src/Globs/main_win.py:274 #, fuzzy msgid "Database purged" msgstr "_Veri Tabanı" #: ../src/Globs/main_win.py:281 msgid "Do you really want to clear the database?" msgstr "Gerçekten veri tabanını silmek istiyor musunuz?" #: ../src/Globs/main_win.py:290 #, fuzzy msgid "Database cleared" msgstr "Veri tabanı farklı kaydedildi:" #: ../src/Globs/main_win.py:310 msgid "Database saved as " msgstr "Veri tabanı farklı kaydedildi:" #: ../src/Globs/main_win.py:385 #, fuzzy msgid "Do you really want to execute the selected benchmarks?" msgstr "" "Kullanılabilir tüm değerlendirmelerin yürütülmesini gerçekten istiyor " "musunuz?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "Şu uzantılar eksik:" #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr "yürütüldü: " #: ../src/Globs/stats_area.py:109 msgid "Best FPS:" msgstr "En İyi FPS:" #: ../src/Globs/stats_area.py:110 msgid "Last FPS:" msgstr "Son FPS:" #: ../src/Globs/stats_area.py:111 msgid "Worst FPS:" msgstr "En Kötü FPS:" #: ../src/Globs/submit.py:91 msgid "One or more compelling parameter is None!" msgstr "Bir ya da daha fazla zorlanmış parametre HİÇ anlamına gelir!" #: ../src/Globs/submit.py:102 msgid "An error occurred during the connection!\n" msgstr "Bağlantı sırasında bir hata oluştu!\n" #: ../src/Globs/user.py:34 msgid "User table exists already" msgstr "Kullanıcı tablosu zaten var" #: ../src/Globs/user.py:74 msgid "No value provided for user name or password!" msgstr "Kullanıcı adı ya da parola için hiç bir değer sağlanmadı!" #, fuzzy #~ msgid "Heigth:" #~ msgstr "Yükseklik:" #~ msgid "Execute All" #~ msgstr "Tümünü Yürüt" #~ msgid "Execute all the available benchmarks" #~ msgstr "Kullanılabilir tüm değerlendirmeleri yürüt" #~ msgid "Submit All" #~ msgstr "Tümünü Gönder" #~ msgid "Submit all the entries in the local database" #~ msgstr "Yerel veri tabanındaki tüm girdileri gönder" #~ msgid "Entries correctly submitted" #~ msgstr "Girdiler başarıyla gönderildi" #~ msgid "Errors occurred submitting the following entries: " #~ msgstr "Şu girdiler gönderilirken hatalar oluştu:" #~ msgid "All the local database entries have been submitted" #~ msgstr "Tüm yerel veri tabanı girdileri gönderildi" #~ msgid "Local database entries have been submitted with errors" #~ msgstr "Yerel veri tabanı girdileri hatalarla gönderildi" globs-0.2.0~svn50/po/fr/0000775000175000017500000000000011516033442014231 5ustar takakitakakiglobs-0.2.0~svn50/po/fr/fr.po0000664000175000017500000003031211516033401015172 0ustar takakitakaki# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-15 02:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Snoopy \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Transfer-Encoding: 8bit\n" #: ../globs.glade.h:1 msgid "Cancel" msgstr "Annuler" #: ../globs.glade.h:2 msgid "Clear the whole local database" msgstr "Effacer entirement la base de donnes locale" #: ../globs.glade.h:3 msgid "Close" msgstr "Fermer" #: ../globs.glade.h:4 #, fuzzy msgid "D_ump" msgstr "Afficher" #: ../globs.glade.h:5 msgid "Delete Entry" msgstr "Effacer une donne" #: ../globs.glade.h:6 msgid "Delete the selected entry" msgstr "Effacer la donne selectionne" #: ../globs.glade.h:7 msgid "Detected Hardware" msgstr "Matriel Dtect" #: ../globs.glade.h:8 msgid "Dump the local database in a text file" msgstr "Sauver la base de donnes locale dans un fichier texte" #: ../globs.glade.h:9 msgid "Email:" msgstr "ml:" #: ../globs.glade.h:10 msgid "Execute" msgstr "Excuter" #: ../globs.glade.h:11 msgid "Execute the selected benchmark" msgstr "Excuter le benchmark slectionn" #: ../globs.glade.h:12 ../src/Globs/local_db_win.py:97 msgid "Fullscreen" msgstr "Plein cran" #: ../globs.glade.h:13 msgid "GL Open Benchmark Suite" msgstr "Suite Ouverte de Benchmark GL" #: ../globs.glade.h:14 #, fuzzy msgid "Height:" msgstr "Hauteur" #: ../globs.glade.h:15 msgid "Homesite:" msgstr "Page Web:" #: ../globs.glade.h:16 msgid "Information" msgstr "Information" #: ../globs.glade.h:17 msgid "Local Database" msgstr "Base de Donnes locale" #: ../globs.glade.h:18 msgid "Location:" msgstr "Emplacement" #: ../globs.glade.h:19 msgid "Lock current" msgstr "Vrouiller actif" #: ../globs.glade.h:20 ../src/Globs/main_win.py:99 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Nom:" #: ../globs.glade.h:21 msgid "OK" msgstr "OK" #: ../globs.glade.h:22 msgid "Open the Detected Hardware window" msgstr "Ouvrir la fentre : Matriel Dtect" #: ../globs.glade.h:23 msgid "Open the browser on the online help page" msgstr "Ouvrir l'aide en ligne dans le navigateur" #: ../globs.glade.h:24 msgid "Open the browser on the remote database browsing page" msgstr "Ouvrir la base de donnes distante dans le navigateur" #: ../globs.glade.h:25 msgid "Open the local database browsing window" msgstr "Ouvrir la base de donnes locale" #: ../globs.glade.h:26 msgid "Options" msgstr "Options:" #: ../globs.glade.h:27 msgid "Password:" msgstr "Mot de Passe:" #: ../globs.glade.h:28 msgid "Preferences" msgstr "Prfrences" #: ../globs.glade.h:29 msgid "Purge entries not related to available benchmarks" msgstr "Vider les entres non relies un benchmark disponible" #: ../globs.glade.h:30 msgid "Refresh list contents reading again from the local database" msgstr "" "Rafraichir le contenu de la iste en rechargeant la base de donnes locale" #: ../globs.glade.h:31 msgid "Repeat:" msgstr "Rpter:" #: ../globs.glade.h:32 #, fuzzy msgid "Resolution:" msgstr "Description:" #: ../globs.glade.h:33 msgid "Show _Local" msgstr "Montrer _Local" #: ../globs.glade.h:34 msgid "Show _Remote" msgstr "Montrer _Distant" #: ../globs.glade.h:35 msgid "Statistics" msgstr "Statistiques" #: ../globs.glade.h:36 msgid "Submit Entry" msgstr "Soumettre une donne" #: ../globs.glade.h:37 msgid "Submit the selected entry to the remote database" msgstr "Soumettre toutes les donnes de la base distante" #: ../globs.glade.h:38 msgid "Time:" msgstr "Temps:" #: ../globs.glade.h:39 msgid "Update" msgstr "Mise jour" #: ../globs.glade.h:40 msgid "User" msgstr "Utilisateur" #: ../globs.glade.h:41 msgid "User:" msgstr "Utilisateur:" #: ../globs.glade.h:42 msgid "Width:" msgstr "Largeur:" #: ../globs.glade.h:43 #, fuzzy msgid "_Clear" msgstr "Effacer" #: ../globs.glade.h:44 msgid "_Database" msgstr "_Base de donnes" #: ../globs.glade.h:45 msgid "_Detected HW" msgstr "_Matriel Dtect" #: ../globs.glade.h:46 msgid "_File" msgstr "_Fichier" #: ../globs.glade.h:47 msgid "_Help" msgstr "_Aide" #: ../globs.glade.h:48 #, fuzzy msgid "_Purge" msgstr "Vider" #: ../globs.glade.h:49 msgid "translator-credits" msgstr "Snoopy (French)" #: ../src/Globs/benchmarks.py:78 ../src/Globs/benchmarks.py:91 #: ../src/Globs/benchmarks.py:109 ../src/Globs/benchmarks.py:139 #: ../src/Globs/benchmarks.py:159 ../src/Globs/benchmarks.py:197 #: ../src/Globs/main_win.py:192 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "n'existe pas!" #: ../src/Globs/benchmarks.py:88 msgid "opts_str() needs at least one argument!" msgstr "opts_str() ncessite au moins un argument!" #: ../src/Globs/benchmarks.py:150 #, python-format msgid "OpenGL extension %s is missing!" msgstr "l'extension OpenGL %s est absente!" #: ../src/Globs/benchmarks.py:188 msgid "Could not parse benchmark output" msgstr "Impossible de lire le rsultat du benchmark" #: ../src/Globs/db.py:35 msgid "Creating" msgstr "Cration" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:100 ../src/Globs/main_win.py:102 #: ../src/Globs/main_win.py:104 ../src/Globs/stats_area.py:117 #: ../src/Globs/stats_area.py:120 ../src/Globs/stats_area.py:123 #: ../src/Globs/stats_area.py:143 ../src/Globs/stats_area.py:150 #: ../src/Globs/stats_area.py:157 msgid "N/A" msgstr "Sans objet" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:115 msgid "General" msgstr "Gnral" #. Single CPU #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:119 #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:121 #: ../src/Globs/hwd_win.py:125 ../src/Globs/hwd_win.py:126 #: ../src/Globs/hwd_win.py:127 ../src/Globs/hwd_win.py:128 msgid "Processor" msgstr "Processeur" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:134 #: ../src/Globs/hwd_win.py:135 msgid "Memory" msgstr "Mmoire" #. Columns #: ../src/Globs/hwd_win.py:62 msgid "Category" msgstr "Catgorie" #. Columns #: ../src/Globs/hwd_win.py:82 msgid "Attribute" msgstr "Attribut" #: ../src/Globs/hwd_win.py:89 msgid "Value" msgstr "Valeur" #: ../src/Globs/hwd_win.py:115 msgid "Hostname" msgstr "Nom d'hte" #: ../src/Globs/hwd_win.py:119 ../src/Globs/hwd_win.py:126 msgid "Model" msgstr "Modle" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Frequency" msgstr "Frquence" #: ../src/Globs/hwd_win.py:125 msgid "CPU" msgstr "CPU" #: ../src/Globs/hwd_win.py:130 msgid "Vendor" msgstr "Marque" #: ../src/Globs/hwd_win.py:131 msgid "Renderer" msgstr "Moteur graphique" #: ../src/Globs/hwd_win.py:132 ../src/Globs/local_db_win.py:69 #: ../src/Globs/main_win.py:131 msgid "Version" msgstr "Version" #: ../src/Globs/hwd_win.py:134 msgid "Physical" msgstr "Physique" #: ../src/Globs/hwd_win.py:135 msgid "Swap" msgstr "Echange" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "La table de Benchmark existe dj" #. Columns #: ../src/Globs/local_db_win.py:62 ../src/Globs/main_win.py:124 msgid "Name" msgstr "Nom" #: ../src/Globs/local_db_win.py:76 msgid "FPS" msgstr "FPS" #: ../src/Globs/local_db_win.py:83 msgid "Width" msgstr "Largeur" #: ../src/Globs/local_db_win.py:90 msgid "Height" msgstr "Hauteur" #: ../src/Globs/local_db_win.py:104 msgid "Time" msgstr "Temps" #: ../src/Globs/local_db_win.py:111 msgid "Date" msgstr "Date" #: ../src/Globs/local_db_win.py:147 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" "Il faudrait fournir un nom d'utilisateur et un mot de passe dans l'onglet " "Utilisateur de la fentre Prfrences!" #: ../src/Globs/local_db_win.py:159 #, fuzzy msgid "Do you really want to submit the selected entries?" msgstr "Voulez-vous vraiment vider la base de donnes?" #: ../src/Globs/local_db_win.py:176 #, fuzzy msgid "Error in the connection!" msgstr "Une erreur est survenue pendant la connection!\n" #: ../src/Globs/local_db_win.py:179 msgid "Malformed URL sent!" msgstr "" #: ../src/Globs/local_db_win.py:182 #, fuzzy msgid "Cannot connect to the remote database!" msgstr "Soumettre toutes les donnes de la base distante" #: ../src/Globs/local_db_win.py:185 msgid "The remote database cannot be selected!" msgstr "" #: ../src/Globs/local_db_win.py:188 msgid "Wrong password!" msgstr "" #: ../src/Globs/local_db_win.py:192 msgid " not updated\n" msgstr "" #: ../src/Globs/local_db_win.py:196 #, fuzzy msgid " updated\n" msgstr "Mise jour" #: ../src/Globs/local_db_win.py:198 ../src/Globs/local_db_win.py:201 #: ../src/Globs/local_db_win.py:204 msgid " inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:200 msgid "New machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:203 msgid "New user and new machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:222 #, fuzzy msgid "Do you really want to delete the selected entries?" msgstr "Voulez-vous vraiment nettoyer la base de donnes?" #: ../src/Globs/main_win.py:101 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Auteur:" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Description:" #: ../src/Globs/main_win.py:138 msgid "Best FPS" msgstr "Meilleur FPS" #: ../src/Globs/main_win.py:157 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:265 msgid "Do you really want to purge the database?" msgstr "Voulez-vous vraiment vider la base de donnes?" #: ../src/Globs/main_win.py:274 #, fuzzy msgid "Database purged" msgstr "_Base de donnes" #: ../src/Globs/main_win.py:281 msgid "Do you really want to clear the database?" msgstr "Voulez-vous vraiment nettoyer la base de donnes?" #: ../src/Globs/main_win.py:290 #, fuzzy msgid "Database cleared" msgstr "Base de donnes enregistre sous " #: ../src/Globs/main_win.py:310 msgid "Database saved as " msgstr "Base de donnes enregistre sous " #: ../src/Globs/main_win.py:385 #, fuzzy msgid "Do you really want to execute the selected benchmarks?" msgstr "Voulez-vous vraiment excuter tous les benchmarks disponibles?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "Il vous manque les extensions suivantes: " #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr " excuter " #: ../src/Globs/stats_area.py:109 msgid "Best FPS:" msgstr "Meilleur FPS:" #: ../src/Globs/stats_area.py:110 msgid "Last FPS:" msgstr "Dernier FPS:" #: ../src/Globs/stats_area.py:111 msgid "Worst FPS:" msgstr "Pire FPS:" #: ../src/Globs/submit.py:91 msgid "One or more compelling parameter is None!" msgstr "Un ou plusieurs paramtre de contrainte est Aucun!" #: ../src/Globs/submit.py:102 msgid "An error occurred during the connection!\n" msgstr "Une erreur est survenue pendant la connection!\n" #: ../src/Globs/user.py:34 msgid "User table exists already" msgstr "La table Utilisateur existe dj" #: ../src/Globs/user.py:74 msgid "No value provided for user name or password!" msgstr "Pas de valeur pour le nom d'utilisateur ou le mot de passe!" #, fuzzy #~ msgid "Heigth:" #~ msgstr "Hauteur:" #~ msgid "Execute All" #~ msgstr "Tout Excuter" #~ msgid "Execute all the available benchmarks" #~ msgstr "Excuter tous les benchmarks disponibles" #~ msgid "Submit All" #~ msgstr "Tout Soumettre" #~ msgid "Submit all the entries in the local database" #~ msgstr "Soumettre toutes les donnes de la base locale" #~ msgid "Entries correctly submitted" #~ msgstr "Donnes soumises correctement" #~ msgid "Errors occurred submitting the following entries: " #~ msgstr "Erreurs dans la soumission des donnes suivantes: " #~ msgid "All the local database entries have been submitted" #~ msgstr "Toutes les donnes de la base locale ont t soumises" #~ msgid "Local database entries have been submitted with errors" #~ msgstr "Les donnes de la base locale ont t soumises avec des erreurs" globs-0.2.0~svn50/po/es/0000775000175000017500000000000011516033442014231 5ustar takakitakakiglobs-0.2.0~svn50/po/es/es.po0000664000175000017500000002762211516033401015204 0ustar takakitakaki# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-15 02:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Rafael Garcia Ortega \n" "Language-Team: SPANISH \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../globs.glade.h:1 msgid "Cancel" msgstr "Cancelar" #: ../globs.glade.h:2 msgid "Clear the whole local database" msgstr "Limpiar base de datos local" #: ../globs.glade.h:3 msgid "Close" msgstr "Cerrar" #: ../globs.glade.h:4 #, fuzzy msgid "D_ump" msgstr "Descargar" #: ../globs.glade.h:5 msgid "Delete Entry" msgstr "Borrar Registro" #: ../globs.glade.h:6 msgid "Delete the selected entry" msgstr "Borrar el registro seleccionado" #: ../globs.glade.h:7 msgid "Detected Hardware" msgstr "Hardware detectado" #: ../globs.glade.h:8 msgid "Dump the local database in a text file" msgstr "Descargar base de datos local a un fichero de texto" #: ../globs.glade.h:9 msgid "Email:" msgstr "Email:" #: ../globs.glade.h:10 msgid "Execute" msgstr "Ejecutar" #: ../globs.glade.h:11 msgid "Execute the selected benchmark" msgstr "Ejecutar el banco de pruebas seleccionado" #: ../globs.glade.h:12 ../src/Globs/local_db_win.py:97 msgid "Fullscreen" msgstr "Pantalla completa" #: ../globs.glade.h:13 msgid "GL Open Benchmark Suite" msgstr "GL Open Benchmark Suite" #: ../globs.glade.h:14 #, fuzzy msgid "Height:" msgstr "Altura" #: ../globs.glade.h:15 msgid "Homesite:" msgstr "Sitio web:" #: ../globs.glade.h:16 msgid "Information" msgstr "Información" #: ../globs.glade.h:17 msgid "Local Database" msgstr "Base de datos local" #: ../globs.glade.h:18 msgid "Location:" msgstr "Localización:" #: ../globs.glade.h:19 msgid "Lock current" msgstr "Bloquear" #: ../globs.glade.h:20 ../src/Globs/main_win.py:99 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Nombre:" #: ../globs.glade.h:21 msgid "OK" msgstr "OK" #: ../globs.glade.h:22 msgid "Open the Detected Hardware window" msgstr "Abir ventana de Hardware Detectado" #: ../globs.glade.h:23 msgid "Open the browser on the online help page" msgstr "Abrir el navegador en la página de ayuda en línea" #: ../globs.glade.h:24 msgid "Open the browser on the remote database browsing page" msgstr "" "Abrir el navegador en la página de navegación de la base de datos remota" #: ../globs.glade.h:25 msgid "Open the local database browsing window" msgstr "Abrir la ventana de navegación de la base de datos local" #: ../globs.glade.h:26 msgid "Options" msgstr "Opciones" #: ../globs.glade.h:27 msgid "Password:" msgstr "Contraseña:" #: ../globs.glade.h:28 msgid "Preferences" msgstr "Preferencias" #: ../globs.glade.h:29 msgid "Purge entries not related to available benchmarks" msgstr "Purgar entradas no relacionadas con los bancos de pruebas disponibles" #: ../globs.glade.h:30 msgid "Refresh list contents reading again from the local database" msgstr "" "Actualizar lista de contenidos leyendo de nuevo desde la base de datos local" #: ../globs.glade.h:31 msgid "Repeat:" msgstr "Repetir:" #: ../globs.glade.h:32 #, fuzzy msgid "Resolution:" msgstr "Descripción:" #: ../globs.glade.h:33 msgid "Show _Local" msgstr "Mostrar _Local" #: ../globs.glade.h:34 msgid "Show _Remote" msgstr "Mostrar _Remota" #: ../globs.glade.h:35 msgid "Statistics" msgstr "Estadísticas" #: ../globs.glade.h:36 msgid "Submit Entry" msgstr "Enviar Registro" #: ../globs.glade.h:37 msgid "Submit the selected entry to the remote database" msgstr "Enviar el registro seleccionado a la base de datos remota" #: ../globs.glade.h:38 msgid "Time:" msgstr "Tiempo:" #: ../globs.glade.h:39 msgid "Update" msgstr "Actualizar" #: ../globs.glade.h:40 msgid "User" msgstr "Usuario" #: ../globs.glade.h:41 msgid "User:" msgstr "Usuario:" #: ../globs.glade.h:42 msgid "Width:" msgstr "Ancho:" #: ../globs.glade.h:43 #, fuzzy msgid "_Clear" msgstr "Limpiar" #: ../globs.glade.h:44 msgid "_Database" msgstr "Base de _Datos" #: ../globs.glade.h:45 msgid "_Detected HW" msgstr "HW _Detectado" #: ../globs.glade.h:46 msgid "_File" msgstr "_Fichero" #: ../globs.glade.h:47 msgid "_Help" msgstr "Ayuda" #: ../globs.glade.h:48 #, fuzzy msgid "_Purge" msgstr "Purgar" #: ../globs.glade.h:49 msgid "translator-credits" msgstr "Créditos-traductor" #: ../src/Globs/benchmarks.py:78 ../src/Globs/benchmarks.py:91 #: ../src/Globs/benchmarks.py:109 ../src/Globs/benchmarks.py:139 #: ../src/Globs/benchmarks.py:159 ../src/Globs/benchmarks.py:197 #: ../src/Globs/main_win.py:192 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "no existe!" #: ../src/Globs/benchmarks.py:88 msgid "opts_str() needs at least one argument!" msgstr "opts_str() necesita al menos un argumento!" #: ../src/Globs/benchmarks.py:150 #, python-format msgid "OpenGL extension %s is missing!" msgstr "Falta extensión OpenGL %s!" #: ../src/Globs/benchmarks.py:188 msgid "Could not parse benchmark output" msgstr "No puedo analizar la salida del banco de pruebas" #: ../src/Globs/db.py:35 msgid "Creating" msgstr "Creando" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:100 ../src/Globs/main_win.py:102 #: ../src/Globs/main_win.py:104 ../src/Globs/stats_area.py:117 #: ../src/Globs/stats_area.py:120 ../src/Globs/stats_area.py:123 #: ../src/Globs/stats_area.py:143 ../src/Globs/stats_area.py:150 #: ../src/Globs/stats_area.py:157 msgid "N/A" msgstr "N/A" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:115 msgid "General" msgstr "General" #. Single CPU #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:119 #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:121 #: ../src/Globs/hwd_win.py:125 ../src/Globs/hwd_win.py:126 #: ../src/Globs/hwd_win.py:127 ../src/Globs/hwd_win.py:128 msgid "Processor" msgstr "Procesador" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:134 #: ../src/Globs/hwd_win.py:135 msgid "Memory" msgstr "Memoria" #. Columns #: ../src/Globs/hwd_win.py:62 msgid "Category" msgstr "Categoría" #. Columns #: ../src/Globs/hwd_win.py:82 msgid "Attribute" msgstr "Atributo" #: ../src/Globs/hwd_win.py:89 msgid "Value" msgstr "Valor" #: ../src/Globs/hwd_win.py:115 msgid "Hostname" msgstr "Hostname" #: ../src/Globs/hwd_win.py:119 ../src/Globs/hwd_win.py:126 msgid "Model" msgstr "Modelo" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Frequency" msgstr "Frecuencia" #: ../src/Globs/hwd_win.py:125 msgid "CPU" msgstr "CPU" #: ../src/Globs/hwd_win.py:130 msgid "Vendor" msgstr "Vendor" #: ../src/Globs/hwd_win.py:131 msgid "Renderer" msgstr "Renderer" #: ../src/Globs/hwd_win.py:132 ../src/Globs/local_db_win.py:69 #: ../src/Globs/main_win.py:131 msgid "Version" msgstr "Version" #: ../src/Globs/hwd_win.py:134 msgid "Physical" msgstr "Física" #: ../src/Globs/hwd_win.py:135 msgid "Swap" msgstr "Intercambio" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "La tabla del banco de prueba ya existe" #. Columns #: ../src/Globs/local_db_win.py:62 ../src/Globs/main_win.py:124 msgid "Name" msgstr "Nombre" #: ../src/Globs/local_db_win.py:76 msgid "FPS" msgstr "FPS" #: ../src/Globs/local_db_win.py:83 msgid "Width" msgstr "Ancho" #: ../src/Globs/local_db_win.py:90 msgid "Height" msgstr "Altura" #: ../src/Globs/local_db_win.py:104 msgid "Time" msgstr "Tiempo" #: ../src/Globs/local_db_win.py:111 msgid "Date" msgstr "Fecha" #: ../src/Globs/local_db_win.py:147 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" "Debes poner un nombre de usuario y un contraseña en la pestaña de usuario en " "la ventana de Preferencias" #: ../src/Globs/local_db_win.py:159 #, fuzzy msgid "Do you really want to submit the selected entries?" msgstr "¿Estás de seguro de querer purgar la base de datos?" #: ../src/Globs/local_db_win.py:176 msgid "Error in the connection!" msgstr "Error en la conexión!" #: ../src/Globs/local_db_win.py:179 msgid "Malformed URL sent!" msgstr "Se envió una URL malformada" #: ../src/Globs/local_db_win.py:182 msgid "Cannot connect to the remote database!" msgstr "No puedo conectar a la base de datos remota!" #: ../src/Globs/local_db_win.py:185 msgid "The remote database cannot be selected!" msgstr "Base de datos remota no puede ser seleccionada!" #: ../src/Globs/local_db_win.py:188 msgid "Wrong password!" msgstr "Constraseña incorrecta!" #: ../src/Globs/local_db_win.py:192 msgid " not updated\n" msgstr " no actualizado\n" #: ../src/Globs/local_db_win.py:196 msgid " updated\n" msgstr " actualizado\n" #: ../src/Globs/local_db_win.py:198 ../src/Globs/local_db_win.py:201 #: ../src/Globs/local_db_win.py:204 msgid " inserted\n" msgstr " insertado\n" #: ../src/Globs/local_db_win.py:200 msgid "New machine inserted\n" msgstr " Nueva máquina insertada\n" #: ../src/Globs/local_db_win.py:203 msgid "New user and new machine inserted\n" msgstr " Usuario y máquina nuevos insertados\n" #: ../src/Globs/local_db_win.py:222 #, fuzzy msgid "Do you really want to delete the selected entries?" msgstr "¿Estás seguro de querer borrar las base de datos?" #: ../src/Globs/main_win.py:101 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Autor:" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Descripción:" #: ../src/Globs/main_win.py:138 msgid "Best FPS" msgstr "Mejor FPS" #: ../src/Globs/main_win.py:157 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:265 msgid "Do you really want to purge the database?" msgstr "¿Estás de seguro de querer purgar la base de datos?" #: ../src/Globs/main_win.py:274 #, fuzzy msgid "Database purged" msgstr "Base de _Datos" #: ../src/Globs/main_win.py:281 msgid "Do you really want to clear the database?" msgstr "¿Estás seguro de querer borrar las base de datos?" #: ../src/Globs/main_win.py:290 #, fuzzy msgid "Database cleared" msgstr "Base de datos grabada como " #: ../src/Globs/main_win.py:310 msgid "Database saved as " msgstr "Base de datos grabada como " #: ../src/Globs/main_win.py:385 #, fuzzy msgid "Do you really want to execute the selected benchmarks?" msgstr "¿Estás seguro de querer ejecutar todos los bancos de pruebas?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "Te faltan las siguientes extensiones: " #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr " ejecutado en" #: ../src/Globs/stats_area.py:109 msgid "Best FPS:" msgstr "Mejor FPS" #: ../src/Globs/stats_area.py:110 msgid "Last FPS:" msgstr "Último FPS" #: ../src/Globs/stats_area.py:111 msgid "Worst FPS:" msgstr "Peor FPS:" #: ../src/Globs/submit.py:91 msgid "One or more compelling parameter is None!" msgstr "Uno o más parámetros obligatorios es None!" #: ../src/Globs/submit.py:102 msgid "An error occurred during the connection!\n" msgstr "Ha ocurrido un error durante la conexión!\n" #: ../src/Globs/user.py:34 msgid "User table exists already" msgstr "La tabla de usuario ya existe" #: ../src/Globs/user.py:74 msgid "No value provided for user name or password!" msgstr "No se ha provisto un valor para el nombre de usuario o la contraseña!" #, fuzzy #~ msgid "Heigth:" #~ msgstr "Altura" #~ msgid "Execute All" #~ msgstr "Ejecutar Todos" #~ msgid "Execute all the available benchmarks" #~ msgstr "Ejecutar todos los bancos de pruebas disponibles" #~ msgid "Submit All" #~ msgstr "Enviar Todos" #~ msgid "Submit all the entries in the local database" #~ msgstr "Enviar todos los registros de la base de datos local" globs-0.2.0~svn50/po/globs.pot0000664000175000017500000002223011516033401015446 0ustar takakitakaki# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-05 16:05+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../ui/about_dlg.ui.h:1 msgid "GL Open Benchmark Suite" msgstr "" #: ../ui/about_dlg.ui.h:2 msgid "translator-credits" msgstr "" #: ../ui/hwd_win.ui.h:1 msgid "Detected Hardware" msgstr "" #: ../ui/local_db_win.ui.h:1 msgid "Delete Entry" msgstr "" #: ../ui/local_db_win.ui.h:2 msgid "Delete the selected entry" msgstr "" #: ../ui/local_db_win.ui.h:3 msgid "Local Database" msgstr "" #: ../ui/local_db_win.ui.h:4 msgid "Refresh the list reading again from the local database" msgstr "" #: ../ui/local_db_win.ui.h:5 msgid "Submit Entry" msgstr "" #: ../ui/local_db_win.ui.h:6 msgid "Submit the selected entry to the remote database" msgstr "" #: ../ui/main_win.ui.h:1 msgid "Clear the whole local database" msgstr "" #: ../ui/main_win.ui.h:2 msgid "D_ump" msgstr "" #: ../ui/main_win.ui.h:3 msgid "Dump the local database in a text file" msgstr "" #: ../ui/main_win.ui.h:4 msgid "Execute" msgstr "" #: ../ui/main_win.ui.h:5 msgid "Execute the selected benchmark" msgstr "" #: ../ui/main_win.ui.h:6 ../src/Globs/local_db_win.py:98 msgid "Fullscreen" msgstr "" #: ../ui/main_win.ui.h:7 msgid "GL O.B.S." msgstr "" #: ../ui/main_win.ui.h:8 msgid "Height:" msgstr "" #: ../ui/main_win.ui.h:9 msgid "Information" msgstr "" #: ../ui/main_win.ui.h:10 msgid "Lock current" msgstr "" #: ../ui/main_win.ui.h:11 msgid "Open the Detected Hardware window" msgstr "" #: ../ui/main_win.ui.h:12 msgid "Open the browser on the online help page" msgstr "" #: ../ui/main_win.ui.h:13 msgid "Open the browser on the remote database browsing page" msgstr "" #: ../ui/main_win.ui.h:14 msgid "Open the local database browsing window" msgstr "" #: ../ui/main_win.ui.h:15 msgid "Options" msgstr "" #: ../ui/main_win.ui.h:16 msgid "Purge entries not related to available benchmarks" msgstr "" #: ../ui/main_win.ui.h:17 msgid "Repeat:" msgstr "" #: ../ui/main_win.ui.h:18 msgid "Resolution:" msgstr "" #: ../ui/main_win.ui.h:19 msgid "Show _Local" msgstr "" #: ../ui/main_win.ui.h:20 msgid "Show _Remote" msgstr "" #: ../ui/main_win.ui.h:21 msgid "Statistics" msgstr "" #: ../ui/main_win.ui.h:22 msgid "Time:" msgstr "" #: ../ui/main_win.ui.h:23 msgid "Width:" msgstr "" #: ../ui/main_win.ui.h:24 msgid "_Clear" msgstr "" #: ../ui/main_win.ui.h:25 msgid "_Database" msgstr "" #: ../ui/main_win.ui.h:26 msgid "_Detected HW" msgstr "" #: ../ui/main_win.ui.h:27 msgid "_File" msgstr "" #: ../ui/main_win.ui.h:28 msgid "_Help" msgstr "" #: ../ui/main_win.ui.h:29 msgid "_Purge" msgstr "" #: ../ui/pref_win.ui.h:1 msgid "Email:" msgstr "" #: ../ui/pref_win.ui.h:2 msgid "Homesite:" msgstr "" #: ../ui/pref_win.ui.h:3 msgid "Location:" msgstr "" #: ../ui/pref_win.ui.h:4 ../src/Globs/main_win.py:101 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "" #: ../ui/pref_win.ui.h:5 msgid "Password:" msgstr "" #: ../ui/pref_win.ui.h:6 msgid "Preferences" msgstr "" #: ../ui/pref_win.ui.h:7 msgid "User" msgstr "" #: ../ui/pref_win.ui.h:8 msgid "User:" msgstr "" #: ../src/Globs/benchmarks.py:83 ../src/Globs/benchmarks.py:96 #: ../src/Globs/benchmarks.py:114 ../src/Globs/benchmarks.py:144 #: ../src/Globs/benchmarks.py:164 ../src/Globs/benchmarks.py:202 #: ../src/Globs/main_win.py:194 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "" #: ../src/Globs/benchmarks.py:93 msgid "opts_str() needs at least one argument!" msgstr "" #: ../src/Globs/benchmarks.py:155 #, python-format msgid "OpenGL extension %s is missing!" msgstr "" #: ../src/Globs/benchmarks.py:193 msgid "Could not parse benchmark output" msgstr "" #: ../src/Globs/db.py:32 msgid "Creating" msgstr "" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:102 ../src/Globs/main_win.py:104 #: ../src/Globs/main_win.py:106 ../src/Globs/stats_area.py:115 #: ../src/Globs/stats_area.py:118 ../src/Globs/stats_area.py:121 #: ../src/Globs/stats_area.py:141 ../src/Globs/stats_area.py:148 #: ../src/Globs/stats_area.py:155 msgid "N/A" msgstr "" #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:116 msgid "General" msgstr "" #. Single CPU #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:120 #: ../src/Globs/hwd_win.py:121 ../src/Globs/hwd_win.py:122 #: ../src/Globs/hwd_win.py:126 ../src/Globs/hwd_win.py:127 #: ../src/Globs/hwd_win.py:128 ../src/Globs/hwd_win.py:129 msgid "Processor" msgstr "" #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:135 #: ../src/Globs/hwd_win.py:136 msgid "Memory" msgstr "" #. Columns #: ../src/Globs/hwd_win.py:63 msgid "Category" msgstr "" #. Columns #: ../src/Globs/hwd_win.py:83 msgid "Attribute" msgstr "" #: ../src/Globs/hwd_win.py:90 msgid "Value" msgstr "" #: ../src/Globs/hwd_win.py:116 msgid "Hostname" msgstr "" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Model" msgstr "" #: ../src/Globs/hwd_win.py:121 ../src/Globs/hwd_win.py:128 msgid "Frequency" msgstr "" #: ../src/Globs/hwd_win.py:126 msgid "CPU" msgstr "" #: ../src/Globs/hwd_win.py:131 msgid "Vendor" msgstr "" #: ../src/Globs/hwd_win.py:132 msgid "Renderer" msgstr "" #: ../src/Globs/hwd_win.py:133 ../src/Globs/local_db_win.py:70 #: ../src/Globs/main_win.py:133 msgid "Version" msgstr "" #: ../src/Globs/hwd_win.py:135 msgid "Physical" msgstr "" #: ../src/Globs/hwd_win.py:136 msgid "Swap" msgstr "" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "" #. Columns #: ../src/Globs/local_db_win.py:63 ../src/Globs/main_win.py:126 msgid "Name" msgstr "" #: ../src/Globs/local_db_win.py:77 msgid "FPS" msgstr "" #: ../src/Globs/local_db_win.py:84 msgid "Width" msgstr "" #: ../src/Globs/local_db_win.py:91 msgid "Height" msgstr "" #: ../src/Globs/local_db_win.py:105 msgid "Time" msgstr "" #: ../src/Globs/local_db_win.py:112 msgid "Date" msgstr "" #: ../src/Globs/local_db_win.py:148 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" #: ../src/Globs/local_db_win.py:160 msgid "Do you really want to submit the selected entries?" msgstr "" #: ../src/Globs/local_db_win.py:177 msgid "Error in the connection!" msgstr "" #: ../src/Globs/local_db_win.py:180 msgid "Malformed URL sent!" msgstr "" #: ../src/Globs/local_db_win.py:183 msgid "Cannot connect to the remote database!" msgstr "" #: ../src/Globs/local_db_win.py:186 msgid "The remote database cannot be selected!" msgstr "" #: ../src/Globs/local_db_win.py:189 msgid "Wrong password!" msgstr "" #: ../src/Globs/local_db_win.py:193 msgid " not updated\n" msgstr "" #: ../src/Globs/local_db_win.py:197 msgid " updated\n" msgstr "" #: ../src/Globs/local_db_win.py:199 ../src/Globs/local_db_win.py:202 #: ../src/Globs/local_db_win.py:205 msgid " inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:201 msgid "New machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:204 msgid "New user and new machine inserted\n" msgstr "" #: ../src/Globs/local_db_win.py:223 msgid "Do you really want to delete the selected entries?" msgstr "" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "" #: ../src/Globs/main_win.py:105 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "" #: ../src/Globs/main_win.py:140 msgid "Best FPS" msgstr "" #: ../src/Globs/main_win.py:159 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:270 msgid "Do you really want to purge the database?" msgstr "" #: ../src/Globs/main_win.py:279 msgid "Database purged" msgstr "" #: ../src/Globs/main_win.py:286 msgid "Do you really want to clear the database?" msgstr "" #: ../src/Globs/main_win.py:295 msgid "Database cleared" msgstr "" #: ../src/Globs/main_win.py:315 msgid "Database saved as " msgstr "" #: ../src/Globs/main_win.py:385 msgid "Do you really want to execute the selected benchmarks?" msgstr "" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "" #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr "" #: ../src/Globs/stats_area.py:107 msgid "Best FPS:" msgstr "" #: ../src/Globs/stats_area.py:108 msgid "Last FPS:" msgstr "" #: ../src/Globs/stats_area.py:109 msgid "Worst FPS:" msgstr "" #: ../src/Globs/submit.py:92 msgid "One or more compelling parameter is None!" msgstr "" #: ../src/Globs/submit.py:103 msgid "An error occurred during the connection!\n" msgstr "" #: ../src/Globs/user.py:35 msgid "User table exists already" msgstr "" #: ../src/Globs/user.py:75 msgid "No value provided for user name or password!" msgstr "" globs-0.2.0~svn50/po/POTFILES.in0000664000175000017500000000076611516033401015403 0ustar takakitakaki[type: gettext/glade]ui/about_dlg.ui [type: gettext/glade]ui/hwd_win.ui [type: gettext/glade]ui/local_db_win.ui [type: gettext/glade]ui/main_win.ui [type: gettext/glade]ui/pref_win.ui src/Globs/__init__.py src/Globs/about_dlg.py src/Globs/app.py src/Globs/benchmarks.py src/Globs/db.py src/Globs/hwd.py src/Globs/hwd_win.py src/Globs/local_db.py src/Globs/local_db_win.py src/Globs/main_win.py src/Globs/pref_win.py src/Globs/statistics.py src/Globs/stats_area.py src/Globs/submit.py src/Globs/user.py globs-0.2.0~svn50/po/it/0000775000175000017500000000000011516033442014236 5ustar takakitakakiglobs-0.2.0~svn50/po/it/it.po0000664000175000017500000002647311516033401015221 0ustar takakitakaki# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-05 16:05+0200\n" "PO-Revision-Date: 2009-10-05 00:17+0100\n" "Last-Translator: Angelo Theodorou \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: ../ui/about_dlg.ui.h:1 msgid "GL Open Benchmark Suite" msgstr "Suite di benchmark aperti OpenGL" #: ../ui/about_dlg.ui.h:2 msgid "translator-credits" msgstr "Angelo \"Encelo\" Theodorou (Italian)" #: ../ui/hwd_win.ui.h:1 msgid "Detected Hardware" msgstr "Hardware Riconosciuto" #: ../ui/local_db_win.ui.h:1 msgid "Delete Entry" msgstr "Cancella voce" #: ../ui/local_db_win.ui.h:2 msgid "Delete the selected entry" msgstr "Cancella la voce selezionata" #: ../ui/local_db_win.ui.h:3 msgid "Local Database" msgstr "Database locale" #: ../ui/local_db_win.ui.h:4 msgid "Refresh the list reading again from the local database" msgstr "Aggiorna la lista leggendo nuovamente dal database locale" #: ../ui/local_db_win.ui.h:5 msgid "Submit Entry" msgstr "Spedisci voce" #: ../ui/local_db_win.ui.h:6 msgid "Submit the selected entry to the remote database" msgstr "Spedisce la voce selezionata al database remoto" #: ../ui/main_win.ui.h:1 msgid "Clear the whole local database" msgstr "Cancella tutto il database locale" #: ../ui/main_win.ui.h:2 msgid "D_ump" msgstr "_Salva" #: ../ui/main_win.ui.h:3 msgid "Dump the local database in a text file" msgstr "Salva il database locale in un file di testo" #: ../ui/main_win.ui.h:4 msgid "Execute" msgstr "Esegui" #: ../ui/main_win.ui.h:5 msgid "Execute the selected benchmark" msgstr "Esegui il benchmark selezionato" #: ../ui/main_win.ui.h:6 ../src/Globs/local_db_win.py:98 msgid "Fullscreen" msgstr "Pieno schermo" #: ../ui/main_win.ui.h:7 msgid "GL O.B.S." msgstr "" #: ../ui/main_win.ui.h:8 msgid "Height:" msgstr "Altezza:" #: ../ui/main_win.ui.h:9 msgid "Information" msgstr "Informazioni" #: ../ui/main_win.ui.h:10 msgid "Lock current" msgstr "Fissa correnti" #: ../ui/main_win.ui.h:11 msgid "Open the Detected Hardware window" msgstr "Apre la finestra Hardware Riconosciuto" #: ../ui/main_win.ui.h:12 msgid "Open the browser on the online help page" msgstr "Punta il browser sulla pagina dell'aiuto in linea" #: ../ui/main_win.ui.h:13 msgid "Open the browser on the remote database browsing page" msgstr "Punta il browser sulla pagina di navigazione del database remoto" #: ../ui/main_win.ui.h:14 msgid "Open the local database browsing window" msgstr "Apre la finestra di navigazione del database locale" #: ../ui/main_win.ui.h:15 msgid "Options" msgstr "Opzioni" #: ../ui/main_win.ui.h:16 msgid "Purge entries not related to available benchmarks" msgstr "Cancella le voci non inerenti a benchmark disponibili" #: ../ui/main_win.ui.h:17 msgid "Repeat:" msgstr "Ripeti:" #: ../ui/main_win.ui.h:18 msgid "Resolution:" msgstr "Risoluzione:" #: ../ui/main_win.ui.h:19 msgid "Show _Local" msgstr "Mostra _Locale" #: ../ui/main_win.ui.h:20 msgid "Show _Remote" msgstr "Mostra _Remoto" #: ../ui/main_win.ui.h:21 msgid "Statistics" msgstr "Statistiche" #: ../ui/main_win.ui.h:22 msgid "Time:" msgstr "Tempo:" #: ../ui/main_win.ui.h:23 msgid "Width:" msgstr "Larghezza" #: ../ui/main_win.ui.h:24 msgid "_Clear" msgstr "_Cancella" #: ../ui/main_win.ui.h:25 msgid "_Database" msgstr "_Database" #: ../ui/main_win.ui.h:26 msgid "_Detected HW" msgstr "_HW Riconosciuto" #: ../ui/main_win.ui.h:27 msgid "_File" msgstr "_Archivio" #: ../ui/main_win.ui.h:28 msgid "_Help" msgstr "A_iuto" #: ../ui/main_win.ui.h:29 msgid "_Purge" msgstr "_Purifica" #: ../ui/pref_win.ui.h:1 msgid "Email:" msgstr "Email:" #: ../ui/pref_win.ui.h:2 msgid "Homesite:" msgstr "Sito:" #: ../ui/pref_win.ui.h:3 msgid "Location:" msgstr "Locazione:" #: ../ui/pref_win.ui.h:4 ../src/Globs/main_win.py:101 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Nome:" #: ../ui/pref_win.ui.h:5 msgid "Password:" msgstr "Password:" #: ../ui/pref_win.ui.h:6 msgid "Preferences" msgstr "Preferenze" #: ../ui/pref_win.ui.h:7 msgid "User" msgstr "Utente" #: ../ui/pref_win.ui.h:8 msgid "User:" msgstr "Utente:" #: ../src/Globs/benchmarks.py:83 ../src/Globs/benchmarks.py:96 #: ../src/Globs/benchmarks.py:114 ../src/Globs/benchmarks.py:144 #: ../src/Globs/benchmarks.py:164 ../src/Globs/benchmarks.py:202 #: ../src/Globs/main_win.py:194 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "non esiste!" #: ../src/Globs/benchmarks.py:93 msgid "opts_str() needs at least one argument!" msgstr "opts_str() ha bisogno di almeno un argomento!" #: ../src/Globs/benchmarks.py:155 #, python-format msgid "OpenGL extension %s is missing!" msgstr "Manca l'estensione OpenGL %s!" #: ../src/Globs/benchmarks.py:193 msgid "Could not parse benchmark output" msgstr "Non stato possibile analizzare l'output del benchmark" #: ../src/Globs/db.py:32 msgid "Creating" msgstr "Sto creando" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:102 ../src/Globs/main_win.py:104 #: ../src/Globs/main_win.py:106 ../src/Globs/stats_area.py:115 #: ../src/Globs/stats_area.py:118 ../src/Globs/stats_area.py:121 #: ../src/Globs/stats_area.py:141 ../src/Globs/stats_area.py:148 #: ../src/Globs/stats_area.py:155 msgid "N/A" msgstr "N/D" #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:116 msgid "General" msgstr "Generale" #. Single CPU #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:120 #: ../src/Globs/hwd_win.py:121 ../src/Globs/hwd_win.py:122 #: ../src/Globs/hwd_win.py:126 ../src/Globs/hwd_win.py:127 #: ../src/Globs/hwd_win.py:128 ../src/Globs/hwd_win.py:129 msgid "Processor" msgstr "Processore" #: ../src/Globs/hwd_win.py:38 ../src/Globs/hwd_win.py:135 #: ../src/Globs/hwd_win.py:136 msgid "Memory" msgstr "Memoria" #. Columns #: ../src/Globs/hwd_win.py:63 msgid "Category" msgstr "Categoria" #. Columns #: ../src/Globs/hwd_win.py:83 msgid "Attribute" msgstr "Attributo" #: ../src/Globs/hwd_win.py:90 msgid "Value" msgstr "Valore" #: ../src/Globs/hwd_win.py:116 msgid "Hostname" msgstr "Hostname" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Model" msgstr "Modello" #: ../src/Globs/hwd_win.py:121 ../src/Globs/hwd_win.py:128 msgid "Frequency" msgstr "Frequenza" #: ../src/Globs/hwd_win.py:126 msgid "CPU" msgstr "CPU" #: ../src/Globs/hwd_win.py:131 msgid "Vendor" msgstr "Vendor" #: ../src/Globs/hwd_win.py:132 msgid "Renderer" msgstr "Renderer" #: ../src/Globs/hwd_win.py:133 ../src/Globs/local_db_win.py:70 #: ../src/Globs/main_win.py:133 msgid "Version" msgstr "Versione" #: ../src/Globs/hwd_win.py:135 msgid "Physical" msgstr "Fisica" #: ../src/Globs/hwd_win.py:136 msgid "Swap" msgstr "Swap" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "La tabella Benchmarks esiste gi" #. Columns #: ../src/Globs/local_db_win.py:63 ../src/Globs/main_win.py:126 msgid "Name" msgstr "Nome" #: ../src/Globs/local_db_win.py:77 msgid "FPS" msgstr "FPS" #: ../src/Globs/local_db_win.py:84 msgid "Width" msgstr "Larghezza" #: ../src/Globs/local_db_win.py:91 msgid "Height" msgstr "Altezza" #: ../src/Globs/local_db_win.py:105 msgid "Time" msgstr "Tempo" #: ../src/Globs/local_db_win.py:112 msgid "Date" msgstr "Data" #: ../src/Globs/local_db_win.py:148 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" "Bisogna fornire un nome utente ed una password nella tab Utente della " "finestra Preferenze!" #: ../src/Globs/local_db_win.py:160 msgid "Do you really want to submit the selected entries?" msgstr "Si intende davvero spedire le voci selezionate?" #: ../src/Globs/local_db_win.py:177 msgid "Error in the connection!" msgstr "Si verificato un errore durante la connessione!" #: ../src/Globs/local_db_win.py:180 msgid "Malformed URL sent!" msgstr "Spedita URL malformata!" #: ../src/Globs/local_db_win.py:183 msgid "Cannot connect to the remote database!" msgstr "Impossibile connettersi al database remoto!" #: ../src/Globs/local_db_win.py:186 msgid "The remote database cannot be selected!" msgstr "Il database remoto non pu essere selezionato!" #: ../src/Globs/local_db_win.py:189 msgid "Wrong password!" msgstr "Password errata!" #: ../src/Globs/local_db_win.py:193 msgid " not updated\n" msgstr "non aggiornato\n" #: ../src/Globs/local_db_win.py:197 msgid " updated\n" msgstr "aggiornato\n" #: ../src/Globs/local_db_win.py:199 ../src/Globs/local_db_win.py:202 #: ../src/Globs/local_db_win.py:205 msgid " inserted\n" msgstr "inserito\n" #: ../src/Globs/local_db_win.py:201 msgid "New machine inserted\n" msgstr "Nuova macchina inserita\n" #: ../src/Globs/local_db_win.py:204 msgid "New user and new machine inserted\n" msgstr "Nuovo utente e nuova macchina inseriti\n" #: ../src/Globs/local_db_win.py:223 msgid "Do you really want to delete the selected entries?" msgstr "Si intende davvero cancellare le voci selezionate?" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Autore:" #: ../src/Globs/main_win.py:105 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Descrizione:" #: ../src/Globs/main_win.py:140 msgid "Best FPS" msgstr "Migliori FPS" #: ../src/Globs/main_win.py:159 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "Personalizzato" #: ../src/Globs/main_win.py:270 msgid "Do you really want to purge the database?" msgstr "Si intende davvero purificare il database?" #: ../src/Globs/main_win.py:279 msgid "Database purged" msgstr "Database purificato" #: ../src/Globs/main_win.py:286 msgid "Do you really want to clear the database?" msgstr "Si intende davvero cancellare il database?" #: ../src/Globs/main_win.py:295 msgid "Database cleared" msgstr "Database cancellato" #: ../src/Globs/main_win.py:315 msgid "Database saved as " msgstr "Database salvato come " #: ../src/Globs/main_win.py:385 msgid "Do you really want to execute the selected benchmarks?" msgstr "Si intende davvero eseguire i benchmark selezionati?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr " non disponibile" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "Mancano le seguenti estensioni: " #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr " eseguito a " #: ../src/Globs/stats_area.py:107 msgid "Best FPS:" msgstr "Migliore:" #: ../src/Globs/stats_area.py:108 msgid "Last FPS:" msgstr "Ultimo:" #: ../src/Globs/stats_area.py:109 msgid "Worst FPS:" msgstr "Peggiore:" #: ../src/Globs/submit.py:92 msgid "One or more compelling parameter is None!" msgstr "Uno o pi parametri obbligatori sono nulli!" #: ../src/Globs/submit.py:103 msgid "An error occurred during the connection!\n" msgstr "Si verificato un errore durante la connessione!\n" #: ../src/Globs/user.py:35 msgid "User table exists already" msgstr "La tabella User esiste gi" #: ../src/Globs/user.py:75 msgid "No value provided for user name or password!" msgstr "Nessun valore fornito per nome utente o password!" globs-0.2.0~svn50/po/sv/0000775000175000017500000000000011516033442014252 5ustar takakitakakiglobs-0.2.0~svn50/po/sv/sv.po0000664000175000017500000002651311516033401015244 0ustar takakitakaki# Swedish translation for globs. # Copyright (C) 2007 Free Software Foundation, Inc. # This file is distributed under the same license as the globs package. # Daniel Nylander , 2007. # msgid "" msgstr "" "Project-Id-Version: globs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-05-15 02:52+0200\n" "PO-Revision-Date: 2007-01-14 15:13+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../globs.glade.h:1 msgid "Cancel" msgstr "Avbryt" #: ../globs.glade.h:2 msgid "Clear the whole local database" msgstr "Töm hela lokala databasen" #: ../globs.glade.h:3 msgid "Close" msgstr "Stäng" #: ../globs.glade.h:4 msgid "D_ump" msgstr "D_umpa" #: ../globs.glade.h:5 msgid "Delete Entry" msgstr "Ta bort post" #: ../globs.glade.h:6 msgid "Delete the selected entry" msgstr "Ta bort markerade posten" #: ../globs.glade.h:7 msgid "Detected Hardware" msgstr "Detekterad hårdvara" #: ../globs.glade.h:8 msgid "Dump the local database in a text file" msgstr "Dumpa den lokala databasen till en textfil" #: ../globs.glade.h:9 msgid "Email:" msgstr "E-post:" #: ../globs.glade.h:10 msgid "Execute" msgstr "Kör" #: ../globs.glade.h:11 msgid "Execute the selected benchmark" msgstr "Kör markerat prestandatest" #: ../globs.glade.h:12 ../src/Globs/local_db_win.py:97 msgid "Fullscreen" msgstr "Helskärm" #: ../globs.glade.h:13 msgid "GL Open Benchmark Suite" msgstr "Prestandamätningssvit för GL Open" #: ../globs.glade.h:14 #, fuzzy msgid "Height:" msgstr "Höjd" #: ../globs.glade.h:15 msgid "Homesite:" msgstr "Webbplats:" #: ../globs.glade.h:16 msgid "Information" msgstr "Information" #: ../globs.glade.h:17 msgid "Local Database" msgstr "Lokal databas" #: ../globs.glade.h:18 msgid "Location:" msgstr "Plats:" #: ../globs.glade.h:19 msgid "Lock current" msgstr "Lås aktuell" #: ../globs.glade.h:20 ../src/Globs/main_win.py:99 #: ../src/Globs/main_win.py:358 msgid "Name:" msgstr "Namn:" #: ../globs.glade.h:21 msgid "OK" msgstr "OK" #: ../globs.glade.h:22 msgid "Open the Detected Hardware window" msgstr "Öppna fönstret Detekterad hårdvara" #: ../globs.glade.h:23 msgid "Open the browser on the online help page" msgstr "Öppna webbläsaren på hjälpsidan" #: ../globs.glade.h:24 msgid "Open the browser on the remote database browsing page" msgstr "Öppna webbläsaren på fjärrdatabasens bläddringssida" #: ../globs.glade.h:25 msgid "Open the local database browsing window" msgstr "Öppna den lokala databasens bläddringsfönster" #: ../globs.glade.h:26 msgid "Options" msgstr "Alternativ" #: ../globs.glade.h:27 msgid "Password:" msgstr "Lösenord:" #: ../globs.glade.h:28 msgid "Preferences" msgstr "Inställningar" #: ../globs.glade.h:29 msgid "Purge entries not related to available benchmarks" msgstr "Rensa poster som inte är relaterade till tillgängliga prestandatester" #: ../globs.glade.h:30 msgid "Refresh list contents reading again from the local database" msgstr "" "Uppdatera listinnehållet innebär att den lokala databasen läses in igen" #: ../globs.glade.h:31 msgid "Repeat:" msgstr "Upprepa:" #: ../globs.glade.h:32 #, fuzzy msgid "Resolution:" msgstr "Beskrivning:" #: ../globs.glade.h:33 msgid "Show _Local" msgstr "Visa _lokal" #: ../globs.glade.h:34 msgid "Show _Remote" msgstr "Visa _fjärr" #: ../globs.glade.h:35 msgid "Statistics" msgstr "Statistik" #: ../globs.glade.h:36 msgid "Submit Entry" msgstr "Skicka in post" #: ../globs.glade.h:37 msgid "Submit the selected entry to the remote database" msgstr "Skicka in markerad post till fjärrdatabasen" #: ../globs.glade.h:38 msgid "Time:" msgstr "Tid:" #: ../globs.glade.h:39 msgid "Update" msgstr "Uppdatera" #: ../globs.glade.h:40 msgid "User" msgstr "Användare" #: ../globs.glade.h:41 msgid "User:" msgstr "Användare:" #: ../globs.glade.h:42 msgid "Width:" msgstr "Bredd:" #: ../globs.glade.h:43 msgid "_Clear" msgstr "_Töm" #: ../globs.glade.h:44 msgid "_Database" msgstr "_Databas" #: ../globs.glade.h:45 msgid "_Detected HW" msgstr "_Detekterad hårdvara" #: ../globs.glade.h:46 msgid "_File" msgstr "_Arkiv" #: ../globs.glade.h:47 msgid "_Help" msgstr "_Hjälp" #: ../globs.glade.h:48 msgid "_Purge" msgstr "_Rensa" #: ../globs.glade.h:49 msgid "translator-credits" msgstr "Daniel Nylander " #: ../src/Globs/benchmarks.py:78 ../src/Globs/benchmarks.py:91 #: ../src/Globs/benchmarks.py:109 ../src/Globs/benchmarks.py:139 #: ../src/Globs/benchmarks.py:159 ../src/Globs/benchmarks.py:197 #: ../src/Globs/main_win.py:192 ../src/Globs/statistics.py:64 #: ../src/Globs/statistics.py:88 ../src/Globs/statistics.py:180 #: ../src/Globs/statistics.py:191 msgid "doesn't exist!" msgstr "finns inte!" #: ../src/Globs/benchmarks.py:88 msgid "opts_str() needs at least one argument!" msgstr "opts_str() behöver åtminstone ett argument!" #: ../src/Globs/benchmarks.py:150 #, python-format msgid "OpenGL extension %s is missing!" msgstr "OpenGL-tillägget %s saknas!" #: ../src/Globs/benchmarks.py:188 msgid "Could not parse benchmark output" msgstr "Kunde inte tolka utdata för prestandatest" #: ../src/Globs/db.py:35 msgid "Creating" msgstr "Skapar" #. Default values if nothing relevant is found from glxinfo output #: ../src/Globs/hwd.py:133 ../src/Globs/hwd.py:134 ../src/Globs/hwd.py:135 #: ../src/Globs/main_win.py:100 ../src/Globs/main_win.py:102 #: ../src/Globs/main_win.py:104 ../src/Globs/stats_area.py:117 #: ../src/Globs/stats_area.py:120 ../src/Globs/stats_area.py:123 #: ../src/Globs/stats_area.py:143 ../src/Globs/stats_area.py:150 #: ../src/Globs/stats_area.py:157 msgid "N/A" msgstr "-" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:115 msgid "General" msgstr "Allmänt" #. Single CPU #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:119 #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:121 #: ../src/Globs/hwd_win.py:125 ../src/Globs/hwd_win.py:126 #: ../src/Globs/hwd_win.py:127 ../src/Globs/hwd_win.py:128 msgid "Processor" msgstr "Processor" #: ../src/Globs/hwd_win.py:37 ../src/Globs/hwd_win.py:134 #: ../src/Globs/hwd_win.py:135 msgid "Memory" msgstr "Minne" #. Columns #: ../src/Globs/hwd_win.py:62 msgid "Category" msgstr "Kategori" #. Columns #: ../src/Globs/hwd_win.py:82 msgid "Attribute" msgstr "Attribut" #: ../src/Globs/hwd_win.py:89 msgid "Value" msgstr "Värde" #: ../src/Globs/hwd_win.py:115 msgid "Hostname" msgstr "Värdnamn" #: ../src/Globs/hwd_win.py:119 ../src/Globs/hwd_win.py:126 msgid "Model" msgstr "Modell" #: ../src/Globs/hwd_win.py:120 ../src/Globs/hwd_win.py:127 msgid "Frequency" msgstr "Frekvens" #: ../src/Globs/hwd_win.py:125 msgid "CPU" msgstr "Processor" #: ../src/Globs/hwd_win.py:130 msgid "Vendor" msgstr "Tillverkare" #: ../src/Globs/hwd_win.py:131 msgid "Renderer" msgstr "Renderare" #: ../src/Globs/hwd_win.py:132 ../src/Globs/local_db_win.py:69 #: ../src/Globs/main_win.py:131 msgid "Version" msgstr "Version" #: ../src/Globs/hwd_win.py:134 msgid "Physical" msgstr "Fysiskt" #: ../src/Globs/hwd_win.py:135 msgid "Swap" msgstr "Växlingsutrymme" #: ../src/Globs/local_db.py:34 msgid "Benchmarks table exists already" msgstr "Tabell för prestandatester finns redan" #. Columns #: ../src/Globs/local_db_win.py:62 ../src/Globs/main_win.py:124 msgid "Name" msgstr "Namn" #: ../src/Globs/local_db_win.py:76 msgid "FPS" msgstr "bilder/s" #: ../src/Globs/local_db_win.py:83 msgid "Width" msgstr "Bredd" #: ../src/Globs/local_db_win.py:90 msgid "Height" msgstr "Höjd" #: ../src/Globs/local_db_win.py:104 msgid "Time" msgstr "Tid" #: ../src/Globs/local_db_win.py:111 msgid "Date" msgstr "Datum" #: ../src/Globs/local_db_win.py:147 msgid "" "You should provide a user name and a password in the User tab of the " "Preferences window!" msgstr "" "Du bör tillhandahålla ett användarnamn och ett lösenord i Användare-fliken i " "inställningsfönstret!" #: ../src/Globs/local_db_win.py:159 msgid "Do you really want to submit the selected entries?" msgstr "Vill du verkligen skicka in de markerade posterna?" #: ../src/Globs/local_db_win.py:176 msgid "Error in the connection!" msgstr "Fel i anslutningen!" #: ../src/Globs/local_db_win.py:179 msgid "Malformed URL sent!" msgstr "Felformulerad URL skickad!" #: ../src/Globs/local_db_win.py:182 msgid "Cannot connect to the remote database!" msgstr "Kan inte ansluta till fjärrdatabasen!" #: ../src/Globs/local_db_win.py:185 msgid "The remote database cannot be selected!" msgstr "Fjärrdatabasen kan inte väljas!" #: ../src/Globs/local_db_win.py:188 msgid "Wrong password!" msgstr "Fel lösenord!" #: ../src/Globs/local_db_win.py:192 msgid " not updated\n" msgstr " inte uppdaterad\n" #: ../src/Globs/local_db_win.py:196 msgid " updated\n" msgstr " uppdaterad\n" #: ../src/Globs/local_db_win.py:198 ../src/Globs/local_db_win.py:201 #: ../src/Globs/local_db_win.py:204 msgid " inserted\n" msgstr " infogad\n" #: ../src/Globs/local_db_win.py:200 msgid "New machine inserted\n" msgstr "Ny maskin lades till\n" #: ../src/Globs/local_db_win.py:203 msgid "New user and new machine inserted\n" msgstr "Ny användare och ny maskin infogades\n" #: ../src/Globs/local_db_win.py:222 msgid "Do you really want to delete the selected entries?" msgstr "Vill du verkligen ta bort de markerade posterna?" #: ../src/Globs/main_win.py:101 ../src/Globs/main_win.py:360 msgid "Author:" msgstr "Upphovsman:" #: ../src/Globs/main_win.py:103 ../src/Globs/main_win.py:362 msgid "Description:" msgstr "Beskrivning:" #: ../src/Globs/main_win.py:138 msgid "Best FPS" msgstr "Bästa bilder/s" #: ../src/Globs/main_win.py:157 ../src/Globs/main_win.py:447 msgid "Custom" msgstr "" #: ../src/Globs/main_win.py:265 msgid "Do you really want to purge the database?" msgstr "Vill du verkligen rensa databasen?" #: ../src/Globs/main_win.py:274 msgid "Database purged" msgstr "Databasen rensad" #: ../src/Globs/main_win.py:281 msgid "Do you really want to clear the database?" msgstr "Vill du verkligen tömma databasen?" #: ../src/Globs/main_win.py:290 msgid "Database cleared" msgstr "Databasen tömd" #: ../src/Globs/main_win.py:310 msgid "Database saved as " msgstr "Databasen sparad som " #: ../src/Globs/main_win.py:385 msgid "Do you really want to execute the selected benchmarks?" msgstr "Vill du verkligen köra de markerade prestandatesterna?" #: ../src/Globs/main_win.py:408 msgid " is not available" msgstr "" #: ../src/Globs/main_win.py:423 msgid "You're missing the following extensions: " msgstr "Du saknar följande tillägg: " #. Inserting in the database #. Appending in the statistics #: ../src/Globs/main_win.py:435 msgid " executed at " msgstr " körd den " #: ../src/Globs/stats_area.py:109 msgid "Best FPS:" msgstr "Bästa bilder/s:" #: ../src/Globs/stats_area.py:110 msgid "Last FPS:" msgstr "Senaste bilder/s:" #: ../src/Globs/stats_area.py:111 msgid "Worst FPS:" msgstr "Sämsta bilder/s:" #: ../src/Globs/submit.py:91 msgid "One or more compelling parameter is None!" msgstr "En eller flera tvingade parametrar är None!" #: ../src/Globs/submit.py:102 msgid "An error occurred during the connection!\n" msgstr "Ett fel inträffade vid anslutningsförsöket!\n" #: ../src/Globs/user.py:34 msgid "User table exists already" msgstr "Användartabellen finns redan" #: ../src/Globs/user.py:74 msgid "No value provided for user name or password!" msgstr "Inget värde tillhandahålls för användarnamn eller lösenord!" #, fuzzy #~ msgid "Heigth:" #~ msgstr "Höjd:" globs-0.2.0~svn50/ChangeLog0000664000175000017500000000143411516033401014753 0ustar takakitakakiglobs 0.2 (** *** 2007) + db.py: PySQLite db options storing, ~/.globs.db + submit.py: submit to a common network database + benchmarks.py: stores current options set + user.py: stores user information in a database table + hwd_win.py: shows detected hardware + pref_win.py: user preferences + local_db_win.py: local database browsing + main_win.py: "Execute All" button * GL_shadow: disabled window resize and pause on losing focus * globs.desktop: category fix * SConstruct: fixed the automatic installation of benchmarks even when the 'install' keyword is were not specified globs 0.1.1 (16 February 2006) + globs, po/: i18n support * globs.desktop: icon path fix * globs.glade: 2 pixels spacing instead of a blank after labels * SConstruct: Better scripts globs-0.2.0~svn50/setup.py0000664000175000017500000000267411516033401014722 0ustar takakitakaki## setup.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## from distutils.core import setup setup(name='globs', version='0.2', description='GL Open Benchmark Suite', author='Angelo "Encelo" Theodorou', author_email='encelo@users.sourceforge.net', url='http://globs.sourceforge.net', license = 'GNU GENERAL PUBLIC LICENSE', classifier = 'Topic :: System :: Benchmark', package_dir={'': 'src'}, packages=['Globs'], scripts=['src/globs'], data_files=[('share/globs/ui', ['ui/about_dlg.ui', 'ui/hwd_win.ui', 'ui/local_db_win.ui', 'ui/main_win.ui', 'ui/pref_win.ui']), ('share/globs/pixmaps', ['pixmaps/globs.png']), ('share/applications', ['globs.desktop'])] ) globs-0.2.0~svn50/AUTHORS0000664000175000017500000000007111516033401014245 0ustar takakitakakiAngelo "Encelo" Theodorou globs-0.2.0~svn50/patchdir.py0000664000175000017500000000456011516033401015354 0ustar takakitakaki#!/usr/bin/env python ## patchdir.py ## ## GL O.B.S.: GL Open Benchmark Suite ## Copyright (C) 2006-2007 Angelo Theodorou ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## import os import sys # Checking shell arguments if len(sys.argv) > 2: print 'Usage: ' + sys.argv[0] + ' prefix=PREFIX_DIR' sys.exit(-5) elif len(sys.argv) == 1: prefix = '/' else: arg1 = sys.argv[1] splitted = arg1.split('=') if splitted[0] == 'prefix': prefix = splitted[1] else: print 'Usage: ' + sys.argv[0] + ' prefix=PREFIX_DIR' sys.exit(-5) # Program running script # Reading original file fname = 'src/globs' try: f = open(fname, 'r') except IOError: print 'File ' + fname + " doesn't exist!" lines = f.readlines() f.close() # Patching lines_p = [] for line in lines: if line.find('share_dir =') != -1: line = 'share_dir = ' + "'" + os.path.join(prefix, 'share/globs') + "'" + '\n' elif line.find('locale_dir =') != -1: line = 'locale_dir = ' + "'" + os.path.join(prefix, 'share/locale') + "'" + '\n' elif line.find('bench_dir =') != -1: line = 'bench_dir = ' + "'" + os.path.join(prefix, 'share/globs') + "'" + '\n' lines_p.append(line) # Writing patched file #f = open(fname, 'w') f = open(fname, 'w') f.writelines(lines_p) f.close() # .desktop file # Reading original file fname = 'globs.desktop' try: f = open(fname, 'r') except IOError: print 'File ' + fname + "doesn't exist!" exit(-1) lines = f.readlines() f.close() # Patching lines_p = [] for line in lines: if line.find('Icon=') != -1: line = 'Icon=' + os.path.join(prefix, 'share/globs/pixmaps', 'globs.png') + '\n' lines_p.append(line) # Writing patched file #f = open(fname, 'w') f = open(fname, 'w') f.writelines(lines_p) f.close()