diff options
author | Bryan O'Sullivan <bos@lindenlab.com> | 2009-09-08 13:27:05 -0700 |
---|---|---|
committer | Bryan O'Sullivan <bos@lindenlab.com> | 2009-09-08 13:27:05 -0700 |
commit | 7ad3af45a66955c0f1fdf905fc341cbac4391510 (patch) | |
tree | 49938a7e5d43b93693fcc7cd206c4283aa3d1a0b /indra | |
parent | 0f0853a6fe23c6eb4341d6a5a0752e224cdf1b22 (diff) | |
parent | 40743eaf99c9cbfee08f0bb44bc7c614bc660f34 (diff) |
Merge
Diffstat (limited to 'indra')
23 files changed, 146 insertions, 105 deletions
diff --git a/indra/develop.py b/indra/develop.py index 249b6519fc..b2b494d1b3 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -579,19 +579,23 @@ class WindowsSetup(PlatformSetup): return ('"%sdevenv.com" %s.sln /build %s' % (self.find_visual_studio(), self.project_name, self.build_type)) - def run(self, command, name=None): + def run(self, command, name=None, retry_on=None, retries=1): '''Run a program. If the program fails, raise an exception.''' - ret = os.system(command) - if ret: - if name is None: - name = command.split(None, 1)[0] - path = self.find_in_path(name) - if not path: - ret = 'was not found' - else: - ret = 'exited with status %d' % ret - raise CommandError('the command %r %s' % - (name, ret)) + while retries: + retries = retries - 1 + ret = os.system(command) + if ret: + if name is None: + name = command.split(None, 1)[0] + path = self.find_in_path(name) + if not path: + error = 'was not found' + else: + error = 'exited with status %d' % ret + if retry_on is not None and retry_on == ret: + print "Retrying... the command %r %s" % (name, error) + else: + raise CommandError('the command %r %s' % (name, error)) def run_cmake(self, args=[]): '''Override to add the vstool.exe call after running cmake.''' @@ -629,11 +633,11 @@ class WindowsSetup(PlatformSetup): for t in targets: cmd = '%s /project %s %s' % (build_cmd, t, ' '.join(opts)) print 'Running %r in %r' % (cmd, d) - self.run(cmd) + self.run(cmd, retry_on=4, retries=3) else: cmd = '%s %s' % (build_cmd, ' '.join(opts)) print 'Running %r in %r' % (cmd, d) - self.run(cmd) + self.run(cmd, retry_on=4, retries=3) finally: os.chdir(cwd) diff --git a/indra/lib/python/indra/util/llversion.py b/indra/lib/python/indra/util/llversion.py index c48ab679f4..2718a85f41 100644 --- a/indra/lib/python/indra/util/llversion.py +++ b/indra/lib/python/indra/util/llversion.py @@ -103,11 +103,21 @@ def get_hg_repo(): return output def get_hg_changeset(): - status, output = commands.getstatusoutput('hg id -i') + # The right thing to do: + # status, output = commands.getstatusoutput('hg id -i') + # if status: + # print >> sys.stderr, output + # sys.exit(1) + + # The temporary hack: + status, output = commands.getstatusoutput('hg parents --template "{rev}"') if status: print >> sys.stderr, output sys.exit(1) - return output + lines = output.splitlines() + if len(lines) > 1: + print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines) + return lines[0] def using_svn(): return os.path.isdir(os.path.join(get_src_root(), '.svn')) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index b57798af0c..6a97446a50 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -236,13 +236,13 @@ target_link_libraries( include(LLAddBuildTest) SET(llcommon_TEST_SOURCE_FILES - # WARNING: Please don't write tests against LLCommon or LLMath until this issue is resolved: https://jira.lindenlab.com/jira/browse/DEV-29456 - # lllazy.cpp ) LL_ADD_PROJECT_UNIT_TESTS(llcommon "${llcommon_TEST_SOURCE_FILES}") #set(TEST_DEBUG on) set(test_libs llcommon ${LLCOMMON_LIBRARIES} ${WINDOWS_LIBRARIES} gmock gtest) +# Have to treat lllazy test as an integration test until this issue is resolved: +# https://jira.lindenlab.com/jira/browse/DEV-29456 LL_ADD_INTEGRATION_TEST(lllazy lllazy.cpp "${test_libs}") # *TODO - reenable these once tcmalloc libs no longer break the build. diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h index a2c1819d8d..f073bd327b 100644 --- a/indra/llcommon/llversionserver.h +++ b/indra/llcommon/llversionserver.h @@ -36,7 +36,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 31; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 0; +const S32 LL_VERSION_BUILD = 2425; const char * const LL_CHANNEL = "Second Life Server"; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 45810a101d..04cf98ce19 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -36,7 +36,7 @@ const S32 LL_VERSION_MAJOR = 2; const S32 LL_VERSION_MINOR = 0; const S32 LL_VERSION_PATCH = 0; -const S32 LL_VERSION_BUILD = 0; +const S32 LL_VERSION_BUILD = 2425; const char * const LL_CHANNEL = "Second Life 2009"; diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index d287a5063a..2bb3800144 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -85,7 +85,8 @@ add_library (llmath ${llmath_SOURCE_FILES}) include(LLAddBuildTest) SET(llmath_TEST_SOURCE_FILES - # WARNING: Please don't write tests against LLCommon or LLMath until this issue is resolved: https://jira.lindenlab.com/jira/browse/DEV-29456 + # nat 2009-08-28: found this commented out and considered implementing it + # using LL_ADD_INTEGRATION_TEST, but there's no llvolume_test.cpp source? # llvolume.cpp ) LL_ADD_PROJECT_UNIT_TESTS(llmath "${llmath_TEST_SOURCE_FILES}") diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 4eb4a72ae7..ec52179a39 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -241,9 +241,5 @@ IF (NOT LINUX AND VIEWER) ) LL_ADD_PROJECT_UNIT_TESTS(llmessage "${llmessage_TEST_SOURCE_FILES}") - - # Commented out - see rationale at bottom of newview's build file + poppy 2009-06-05 - # Don't make llmessage depend on llsdmessage_test because ADD_COMM_BUILD_TEST depends on llmessage! - # ADD_COMM_BUILD_TEST(llsdmessage "" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py") ENDIF (NOT LINUX AND VIEWER) diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index a4304596de..a403c44b71 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -551,7 +551,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer. // The reason it is a slot is so that the legacy get() function below can bind an old callback // and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior -// deson't get lost. As a result, we have to bind the slot to a signal to call it, even when +// doesn't get lost. As a result, we have to bind the slot to a signal to call it, even when // we call it immediately. -Steve // NOTE: Even though passing first and last name is a bit of extra overhead, it eliminates the // potential need for any parsing should any code need to handle first and last name independently. diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 297540ffc0..b95c5d46dd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1511,11 +1511,6 @@ endif (INSTALL) include(LLAddBuildTest) SET(viewer_TEST_SOURCE_FILES llagentaccess.cpp - # Not *actually* a unit test, it's an integration test. - # Because it won't work in the new unit test iface, i've commented out - # and notified Nat. Delete this when it's replaced! - # + poppy & brad 2009-06-05 - # llcapabilitylistener.cpp ) set_source_files_properties( ${viewer_TEST_SOURCE_FILES} @@ -1583,10 +1578,3 @@ if (WINDOWS) ) endif (WINDOWS) -if (DARWIN) -# Don't do this here -- it's taken care of by viewer_manifest.py -# add_custom_command(TARGET ${VIEWER_BINARY_NAME} POST_BUILD -# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/ -# DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib -# ) -endif (DARWIN) diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 735424c647..28853ba032 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -2,6 +2,6 @@ CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 2.0.0.0"; -CFBundleGetInfoString = "Second Life version 2.0.0.0, Copyright 2004-2009 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 2.0.0.2425"; +CFBundleGetInfoString = "Second Life version 2.0.0.2425, Copyright 2004-2009 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 7264044d37..c0a33feaec 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@ </dict> </array> <key>CFBundleVersion</key> - <string>2.0.0.0</string> + <string>2.0.0.2425</string> <key>CSResourcesFileMapped</key> <true/> </dict> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4e2f836606..2a08f62bb4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -23,6 +23,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>AgentPause</key> + <map> + <key>Comment</key> + <string>Ask the simulator to stop updating the agent while enabled</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>AlertedUnsupportedHardware</key> <map> <key>Comment</key> diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 2c1707e49f..be832ebe32 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -470,6 +470,19 @@ bool handleVelocityInterpolate(const LLSD& newvalue) return true; } +bool toggle_agent_pause(const LLSD& newvalue) +{ + if ( newvalue.asBoolean() ) + { + send_agent_pause(); + } + else + { + send_agent_resume(); + } + return true; +} + //////////////////////////////////////////////////////////////////////////// void settings_setup_listeners() @@ -601,6 +614,7 @@ void settings_setup_listeners() gSavedSettings.getControl("VelocityInterpolate")->getSignal()->connect(boost::bind(&handleVelocityInterpolate, _2)); gSavedSettings.getControl("QAMode")->getSignal()->connect(boost::bind(&show_debug_menus)); gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus)); + gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2)); } #if TEST_CACHED_CONTROL diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 9a0938b879..d64fc7c8da 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -138,8 +138,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,0,0,0 - PRODUCTVERSION 2,0,0,0 + FILEVERSION 2,0,0,2425 + PRODUCTVERSION 2,0,0,2425 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -156,12 +156,12 @@ BEGIN BEGIN VALUE "CompanyName", "Linden Lab" VALUE "FileDescription", "Second Life" - VALUE "FileVersion", "2.0.0.0" + VALUE "FileVersion", "2.0.0.2425" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright � 2001-2008, Linden Research, Inc." VALUE "OriginalFilename", "SecondLife.exe" VALUE "ProductName", "Second Life" - VALUE "ProductVersion", "2.0.0.0" + VALUE "ProductVersion", "2.0.0.2425" END END BLOCK "VarFileInfo" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 352ec79385..ef9e22d908 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2138,6 +2138,17 @@ layout="topleft" name="Network" tear_off="true"> + <menu_item_check + label="Pause Agent" + layout="topleft" + name="AgentPause"> + <menu_item_check.on_check + function="CheckControl" + parameter="AgentPause" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="AgentPause" /> + </menu_item_check> <menu_item_call label="Enable Message Log" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 01602dc906..d90be9ea25 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -212,7 +212,7 @@ top_pad="15" value="Account Status:" width="100" /> - <link + <!-- <link type="string" follows="left|top" font="SansSerifSmall" @@ -223,7 +223,7 @@ name="my_account_link" top_delta="0" value="Go to Dashboard" - width="100"/> + width="100"/> --> <text follows="left|top|right" height="15" @@ -246,7 +246,7 @@ top_pad="15" value="Partner:" width="100" /> - <link + <!--<link follows="left|top" height="15" font.style="UNDERLINE" @@ -255,18 +255,18 @@ name="partner_edit_link" top_delta="0" value="Edit" - width="100" /> + width="100" /> --> <panel follows="left|top|right" height="15" layout="topleft" left="10" name="partner_data_panel" - top_pad="10" + top_pad="5" width="255"> <text follows="left|top|right" - height="30" + height="15" layout="topleft" left="0" name="partner_text" diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml index d7736832a3..a34b005448 100644 --- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<filter_editor select_on_focus="true"
- background_image_disabled="TextField_Search_Disabled"
- background_image_focused="TextField_Search_Active">
- <clear_filter_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
-</filter_editor>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<filter_editor select_on_focus="true" + background_image_disabled="TextField_Search_Disabled" + background_image_focused="TextField_Search_Active"> + <clear_filter_button label="" + image_unselected="Icon_Close_Foreground" + image_selected="Icon_Close_Press" /> +</filter_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/list_view.xml b/indra/newview/skins/default/xui/en/widgets/list_view.xml index c66aeb57a0..2e976bc755 100644 --- a/indra/newview/skins/default/xui/en/widgets/list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/list_view.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<list_view
- fg_selected_color="ListViewSelectedFgColor"
- bg_selected_color="ListViewSelectedBgColor"
- bg_color="ListViewBgColor"
- />
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<list_view + fg_selected_color="ListViewSelectedFgColor" + bg_selected_color="ListViewSelectedBgColor" + bg_color="ListViewBgColor" + /> diff --git a/indra/newview/skins/default/xui/en/widgets/split_button.xml b/indra/newview/skins/default/xui/en/widgets/split_button.xml index b0367b599b..c0d3c6d7f6 100644 --- a/indra/newview/skins/default/xui/en/widgets/split_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/split_button.xml @@ -1,24 +1,24 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<split_button
- font="SansSerifSmall"
- arrow_position="left"
- follows="right|top">
- <split_button.arrow_button
- name="Arrow Button"
- label=""
- font="SansSerifSmall"
- scale_image="true"
- image_selected="camera_presets/camera_presets_arrow.png"
- image_unselected="camera_presets/camera_presets_arrow.png"
- image_disabled_selected="camera_presets/camera_presets_arrow.png"
- image_disabled="camera_presets/camera_presets_arrow.png"
- width="10"/>
- <split_button.items_panel
- background_visible="true"
- border="true"
- bg_alpha_color="1 1 1 1"
- bg_opaq_color="1 1 1 1"
- layout="topleft"
- name="item_buttons"
- />
-</split_button>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<split_button + font="SansSerifSmall" + arrow_position="left" + follows="right|top"> + <split_button.arrow_button + name="Arrow Button" + label="" + font="SansSerifSmall" + scale_image="true" + image_selected="camera_presets/camera_presets_arrow.png" + image_unselected="camera_presets/camera_presets_arrow.png" + image_disabled_selected="camera_presets/camera_presets_arrow.png" + image_disabled="camera_presets/camera_presets_arrow.png" + width="10"/> + <split_button.items_panel + background_visible="true" + border="true" + bg_alpha_color="1 1 1 1" + bg_opaq_color="1 1 1 1" + layout="topleft" + name="item_buttons" + /> +</split_button> diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 7aad55fb37..6dfb6ecf9c 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -3,7 +3,7 @@ tab_max_width="150" tab_top_image_unselected="TabTop_Middle_Off" tab_top_image_selected="TabTop_Middle_Selected" - tab_bottom_image_unselected="tab_bottom_blue.tga" - tab_bottom_image_selected="tab_bottom_selected_blue.tga" + tab_bottom_image_unselected="Toolbar_Left_Off" + tab_bottom_image_selected="Toolbar_Left_Selected" tab_left_image_unselected="TabTop_Left_Off" tab_left_image_selected="TabTop_Left_Selected"/>
\ No newline at end of file diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index ae3b1ba43e..e85fddbc99 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -395,9 +395,16 @@ class WindowsManifest(ViewerManifest): self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) # self.remove(self.dst_path_of(tempfile)) # If we're on a build machine, sign the code using our Authenticode certificate. JC - sign_py = 'C:\\buildscripts\\code-signing\\sign.py' + sign_py = os.path.expandvars("${SIGN}") + if not sign_py or sign_py == "${SIGN}": + sign_py = 'C:\\buildscripts\\code-signing\\sign.py' + else: + sign_py = sign_py.replace('\\', '\\\\\\\\') + python = os.path.expandvars("${PYTHON}") + if not python or python == "${PYTHON}": + python = 'python' if os.path.exists(sign_py): - self.run_command(sign_py + ' ' + self.dst_path_of(installer_file)) + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) else: print "Skipping code signing,", sign_py, "does not exist" self.created_path(self.dst_path_of(installer_file)) diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index cd90884d09..f668867a02 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -1,5 +1,5 @@ /** - * @file LLMediaPluginTest2.cpp + * @file LLMediaPluginTest.cpp * @brief Primary test application for LLMedia (Separate Process) Plugin system * * $LicenseInfo:firstyear=2008&license=viewergpl$ @@ -222,14 +222,13 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind resetView(); // initial media panel - //const int num_initial_panels = 4; - //for( int i = 0; i < num_initial_panels; ++i ) - //{ - // addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); - //}; - // always add a Web panel for testing - addMediaPanel( "http://www.google.com" ); + const int num_initial_panels = 1; + for( int i = 0; i < num_initial_panels; ++i ) + { + //addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); + addMediaPanel( mHomeWebUrl ); + }; } //////////////////////////////////////////////////////////////////////////////// @@ -2113,13 +2112,13 @@ int main( int argc, char* argv[] ) const int app_window_x = 80; const int app_window_y = 0; - const int app_window_width = 964; - const int app_window_height = 964; + const int app_window_width = 960; + const int app_window_height = 960; glutInitWindowPosition( app_window_x, app_window_y ); glutInitWindowSize( app_window_width, app_window_height ); - int app_window_handle = glutCreateWindow( "LLMediaPluginTest2" ); + int app_window_handle = glutCreateWindow( "LLMediaPluginTest" ); glutDisplayFunc( glutDisplay ); diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h index 079b40ddc0..2d0ba0e3f6 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.h +++ b/indra/test_apps/llplugintest/llmediaplugintest.h @@ -1,5 +1,5 @@ /** - * @file LLMediaPluginTest2.cpp + * @file LLMediaPluginTest.cpp * @brief Primary test application for LLMedia (Separate Process) Plugin system * * $LicenseInfo:firstyear=2008&license=viewergpl$ |