Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: cbcfa9b52d
Fetching contributors…

Cannot retrieve contributors at this time

570 lines (541 sloc) 26.422 kb
<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd">
<name>runkit</name>
<uri>http://github.com/downloads/zenovich/runkit/runkit-1.0.3</uri>
<summary>For all those things you.... probably shouldn&apos;t have been doing anyway....</summary>
<description>Replace, rename, and remove user defined functions and classes.
Define customized superglobal variables for general purpose use.
Execute code in restricted environment (sandboxing).
</description>
<lead>
<name>Dmitry Zenovich</name>
<user></user>
<email>dzenovich@gmail.com</email>
<active>yes</active>
</lead>
<date>2012-01-02</date>
<version>
<release>1.0.4</release>
<api>1.0.4</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.opensource.org/licenses/BSD-3-Clause">BSD License (3 Clause)</license>
<notes>
New features:
+ PHP 5.4 is now fully supported
+ Introduced new function "runkit_default_property_remove" (Thanks to Juhan Kundla)
+ Ability to add non-scalar default properties was added
+ Magic methods __isset, __unset, __callStatic, and __toString are now supported.
+ Functions runkit_class_adopt &amp; runkit_class_emancipate now change class-hierarchy (issue #13)
+ Adding and redefining functions and methods, which return references, were fully implemented
New optional argument 'return_ref' of functions runkit_function_add and runkit_function_redefine was introduced
New constant RUNKIT_ACC_RETURN_REFERENCE was introduced for use with functions runkit_method_add and runkit_method_redefine
+ Properties adding, removing, and importing were reworked for proper inheritance (including objects in PHP5+)
Critical fixes:
* Highly probable crashes on using Reflection objects after modifying removing or renaming of functions, methods, and properties,
for which those Reflection objects have been instantiated, were eliminated
* Crash on sandbox creation when register_globals is switched on was fixed
* Building and working with PHP4 were fixed
* Crash on syntax error in source file importing with runkit_import was fixed
* The possible crash on manipulating constants having length less than two characters was eliminated
Fixes:
* All ways of adding and removing magic methods and old-style constructors
were reworked and corrected (Thanks to Anthony Dovgal for issue #35).
* Side effect of redefining, adding and removing class constant (Issue #25) was eliminated
* Adding of non-lowercase default properties was fixed (removed lowercasing)
* Skip the leading slash in class names
* Copying of functions was reworked
* Converting of input parameters (class names &amp; function names) to lowecase was eliminated
* runkit_method_redefine function now sets the 'prototype' field for the method
and its descendants (Thanks to Anthony Dovgal)
* Freeing already freed memory on importing of a non-existent file was eliminated
* A test for correctness of runkit.superglobals feature was added
* Tests for correctness of inheritance of properties were added
* Tests for correctness of adding static properties were added
Build system improvements:
* Declarations after statement were restricted during compiling
* Warnings now will be treated as errors
* All tests now succeed under valgrind
* A compilation bug (with gcc 4.3+), caused by wrong definition of internal function,
was fixed (Thanks to Reeze Xia)
</notes>
<contents>
<dir name="/">
<dir name="tests">
<file name="runkit_add_magic_methods.phpt" role="test" />
<file name="runkit_add_old_style_ctor.phpt" role="test" />
<file name="runkit_add_old_style_ctor1.phpt" role="test" />
<file name="runkit_add_old_style_ctor_by_adopting.phpt" role="test" />
<file name="runkit_add_old_style_ctor_by_copying.phpt" role="test" />
<file name="runkit_add_old_style_ctor_by_importing.inc" role="test" />
<file name="runkit_add_old_style_ctor_by_importing.phpt" role="test" />
<file name="runkit_adopt_emancipate_and_inheritance.phpt" role="test" />
<file name="runkit_and_superglobals.phpt" role="test" />
<file name="runkit_class_adopt.phpt" role="test" />
<file name="runkit_class_emancipate.phpt" role="test" />
<file name="runkit_class_emancipate_and_reflection.phpt" role="test" />
<file name="runkit_constant_add.phpt" role="test" />
<file name="runkit_constant_add_to_class.phpt" role="test" />
<file name="runkit_constant_redefine.phpt" role="test" />
<file name="runkit_constant_redefine_in_class.phpt" role="test" />
<file name="runkit_constant_remove.phpt" role="test" />
<file name="runkit_constant_remove_from_class.phpt" role="test" />
<file name="runkit_constants_manipulations_and_cache.phpt" role="test" />
<file name="runkit_function_redefine_and_reflection.phpt" role="test" />
<file name="runkit_function_redefine_and_revert.phpt" role="test" />
<file name="runkit_function_add.phpt" role="test" />
<file name="runkit_function_copy.phpt" role="test" />
<file name="runkit_function_redefine.phpt" role="test" />
<file name="runkit_function_redefine_from_anonymous.phpt" role="test" />
<file name="runkit_function_remove.phpt" role="test" />
<file name="runkit_function_remove_and_reflection_parameter.phpt" role="test" />
<file name="runkit_function_remove_and_reflection.phpt" role="test" />
<file name="runkit_function_rename.phpt" role="test" />
<file name="runkit_function_rename_and_reflection.phpt" role="test" />
<file name="runkit_function_rename_internal.phpt" role="test" />
<file name="runkit_function_rename_redefine_add_remove.phpt" role="test" />
<file name="runkit_functions_redefining_and_cache.inc" role="test" />
<file name="runkit_functions_redefining_and_cache.phpt" role="test" />
<file name="runkit_functions_returning_by_reference.phpt" role="test" />
<file name="runkit_import_class.inc" role="test" />
<file name="runkit_import_class.phpt" role="test" />
<file name="runkit_import_constant_properties.inc" role="test" />
<file name="runkit_import_constant_properties.phpt" role="test" />
<file name="runkit_import_constant_static_properties.inc" role="test" />
<file name="runkit_import_constant_static_properties.phpt" role="test" />
<file name="runkit_import_functions.inc" role="test" />
<file name="runkit_import_functions.phpt" role="test" />
<file name="runkit_import_function_and_reflection.inc" role="test" />
<file name="runkit_import_function_and_reflection.phpt" role="test" />
<file name="runkit_import_function_with_static_var.inc" role="test" />
<file name="runkit_import_function_with_static_var.phpt" role="test" />
<file name="runkit_import_method_and_reflection.inc" role="test" />
<file name="runkit_import_method_and_reflection.phpt" role="test" />
<file name="runkit_import_method_with_closure.inc" role="test" />
<file name="runkit_import_method_with_closure.phpt" role="test" />
<file name="runkit_import_method_with_static_var.inc" role="test" />
<file name="runkit_import_method_with_static_var.phpt" role="test" />
<file name="runkit_lint.phpt" role="test" />
<file name="runkit_method_add.phpt" role="test" />
<file name="runkit_method_copy.phpt" role="test" />
<file name="runkit_method_copy_uninit_read.phpt" role="test" />
<file name="runkit_method_redefine.phpt" role="test" />
<file name="runkit_method_redefine_and_reflection.phpt" role="test" />
<file name="runkit_method_redefine_and_reflection_with_inheritance.phpt" role="test" />
<file name="runkit_method_redefine_protected.phpt" role="test" />
<file name="runkit_method_redefine_update_proto.phpt" role="test" />
<file name="runkit_method_redefine_update_proto2.phpt" role="test" />
<file name="runkit_method_redefine_with_static_vars.phpt" role="test" />
<file name="runkit_method_remove.phpt" role="test" />
<file name="runkit_method_remove_and_reflection_parameter.phpt" role="test" />
<file name="runkit_method_remove_and_reflection_parameter_with_inheritance.phpt" role="test" />
<file name="runkit_method_remove_and_reflection.phpt" role="test" />
<file name="runkit_method_remove_and_reflection_with_inheritance.phpt" role="test" />
<file name="runkit_method_rename.phpt" role="test" />
<file name="runkit_method_rename_and_reflection.phpt" role="test" />
<file name="runkit_method_rename_inheritance.phpt" role="test" />
<file name="runkit_methods_redefining_and_cache.inc" role="test" />
<file name="runkit_methods_redefining_and_cache.phpt" role="test" />
<file name="runkit_methods_returning_by_reference.phpt" role="test" />
<file name="runkit_redefine_old_style_ctor.phpt" role="test" />
<file name="runkit_return_value_used.phpt" role="test" />
<file name="runkit_zval_inspect.phpt" role="test" />
<file name="Runkit_Sandbox_.active.phpt" role="test" />
<file name="Runkit_Sandbox_.output_handler.phpt" role="test" />
<file name="runkit_sandbox_output_handler.phpt" role="test" />
<file name="Runkit_Sandbox_Parent1.phpt" role="test" />
<file name="Runkit_Sandbox_Parent2.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.call.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.call.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.die.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.die.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.echo.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.echo.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.eval.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.eval.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.read.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.read.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.scope.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.write.access.phpt" role="test" />
<file name="Runkit_Sandbox_Parent__.write.phpt" role="test" />
<file name="Runkit_Sandbox__call.phpt" role="test" />
<file name="Runkit_Sandbox__call_user_func_closure.phpt" role="test" />
<file name="Runkit_Sandbox__die.phpt" role="test" />
<file name="Runkit_Sandbox__disable_classes.phpt" role="test" />
<file name="Runkit_Sandbox__disable_functions.phpt" role="test" />
<file name="Runkit_Sandbox__echo.phpt" role="test" />
<file name="Runkit_Sandbox__eval.phpt" role="test" />
<file name="Runkit_Sandbox__get.phpt" role="test" />
<file name="Runkit_Sandbox__grandchild.phpt" role="test" rolw="test" />
<file name="Runkit_Sandbox__set.phpt" role="test" />
<file name="bug10053.phpt" role="test" />
<file name="bug10300.phpt" role="test" />
<file name="bug4519.inc" role="test" />
<file name="bug4519.phpt" role="test" />
<file name="namespaces.phpt" role="test" />
<file name="runkit_default_property_add.phpt" role="test" />
<file name="runkit_default_property_add4.phpt" role="test" />
<file name="runkit_default_property_add_and_remove_for_class_with_dynamic_properties.phpt" role="test" />
<file name="runkit_default_property_add_to_subclasses.phpt" role="test" />
<file name="runkit_default_property_remove.phpt" role="test" />
<file name="runkit_default_property_remove_and_add_for_class_with_dynamic_properties.phpt" role="test" />
<file name="runkit_default_property_remove_and_reflection.phpt" role="test" />
<file name="runkit_default_property_remove_from_subclasses.phpt" role="test" />
<file name="runkit_default_property_remove_from_subclasses4.phpt" role="test" />
<file name="runkit_default_property_remove_inheritance.phpt" role="test" />
<file name="runkit_default_property_remove4.phpt" role="test" />
<file name="runkit_import_class4.inc" role="test" />
<file name="runkit_import_class4.phpt" role="test" />
<file name="runkit_import_class_property_not_overriding_subclasses.inc" role="test" />
<file name="runkit_import_class_property_not_overriding_subclasses.phpt" role="test" />
<file name="runkit_import_class_property_not_overriding_subclasses4.inc" role="test" />
<file name="runkit_import_class_property_not_overriding_subclasses4.phpt" role="test" />
<file name="runkit_import_class_property.inc" role="test" />
<file name="runkit_import_class_property.phpt" role="test" />
<file name="runkit_import_class_property4.inc" role="test" />
<file name="runkit_import_class_property4.phpt" role="test" />
<file name="runkit_import_non_existent_file.phpt" role="test" />
<file name="runkit_import_static_properties_override.inc" role="test" />
<file name="runkit_import_static_properties_override.phpt" role="test" />
<file name="runkit_import_with_syntax_error.inc" role="test" />
<file name="runkit_import_with_syntax_error.phpt" role="test" />
<file name="runkit_sandbox_with_register_globals.phpt" role="test" />
<file name="runkit_static_property_add.phpt" role="test" />
<file name="runkit_static_property_add_existing.phpt" role="test" />
<file name="runkit_static_property_add_to_subclasses.phpt" role="test" />
<file name="runkit_superglobals.phpt" role="test" />
</dir> <!-- //tests -->
<file name="config.m4" role="src" />
<file name="config.w32" role="src" />
<file name="php_runkit.h" role="src" />
<file name="LICENSE" role="doc" />
<file name="README" role="doc" />
<file name="runkit.c" role="src" />
<file name="runkit.dsp" role="src" />
<file name="runkit_classes.c" role="src" />
<file name="runkit_constants.c" role="src" />
<file name="runkit_functions.c" role="src" />
<file name="runkit_import.c" role="src" />
<file name="runkit_methods.c" role="src" />
<file name="runkit_props.c" role="src" />
<file name="runkit_sandbox.c" role="src" />
<file name="runkit_sandbox_parent.c" role="src" />
<file name="tsrm_5.0.diff" role="src" />
</dir> <!-- / -->
</contents>
<dependencies>
<required>
<php>
<min>4.0.0</min>
</php>
<pearinstaller>
<min>1.4.0b1</min>
</pearinstaller>
</required>
</dependencies>
<providesextension>runkit</providesextension>
<extsrcrelease />
<changelog>
<release>
<date>2012-01-02</date>
<version>
<release>1.0.3</release>
<api>1.0.1</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.opensource.org/licenses/BSD-3-Clause">BSD License (3 Clause)</license>
<notes>
License was changed to the BSD License (3 Clause)
Main bug-fixes:
* Building on windows-platform was fixed.
* The issue with inheritance of methods, which have been created by the runkit_method_rename function, was fixed.
* Fixed dumb bug in workarounds based on php-version.</notes>
</release>
<release>
<date>2010-10-05</date>
<version>
<release>1.0.2</release>
<api>1.0.1</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>Disappointing incompatibility issue with php 5.3+ in untested code was fixed.</notes>
</release>
<release>
<date>2010-10-03</date>
<version>
<release>1.0.1</release>
<api>1.0.1</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>
New features:
+ The patch made by David Sklar was applied to support creation and changing of static methods.
The new user-level const &quot;RUNKIT_ACC_STATIC&quot; was introduced.
+ An ability to import static class properties was added.
The new user-level const &quot;RUNKIT_IMPORT_CLASS_STATIC_PROPS&quot; was introduced.
+ An ability to apply a closure to a sandbox in PHP 5.3+ by calling the call_user_func method was added.
Main bug-fixes:
* Fixes of issues with importing constant arrays into properties and constants
* Fixes of issues with importing functions or methods having static variables inside them
* The behaviour that old methods had been always overridden by new ones independently from
the RUNKIT_IMPORT_OVERRIDE flag was corrected
* Compatibility with 5.3+ in zts mode
* runkit_function_* functions were fixed with the patch from Keisial at gmail dot com
(see the second comment from http://pecl.php.net/bugs/bug.php?id=14086)
* The reverting of protected methods via runkit_method_copy was corrected, the segmentation fault
on calling restored method was eliminated
* Elimination of the segmentation-fault on exit after restoring modified internal functions
(see also http://pecl.php.net/bugs/bug.php?id=11632)
* Correction for the situation when a method or function having static variables in itself
and copied by runkit crashes afterwards on calling if the original method or function was removed
* The issue that the runkit used to create new methods with lowercase names was fixed, tests were extended
* Methods&apos; prototype detection was fixed</notes>
</release>
<release>
<date>2010-04-01</date>
<version>
<release>1.0</release>
<api>0.8</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>This version never was released. It contains all changes from official PHP repository since the release of 0.9:
johannes: function_entry -> zend_function_entry
philip: Fixed test
bjori: Fixed PHP bug#46847 (phpinfo() is missing some settings.)
felipe: 'static' was added into ZEND_BEGIN_ARG_INFO_EX macro
mlively: Rework of runkit_import to allow the fixing of 4519.
sfox: Bring the majority of PECL extensions into line with macro/x.x.x versioning.
sebastian: Fix #10053: memory exhausted, patch by Stefan Marr.
Fix #10300: Segfault when copying __call(), patch by Stefan Marr.
Fix #12371. Patch by Stefan Marr &lt;mail@stefan-marr.de&gt;.
PHP 5.3+ compatibility.
mike: fix build: use Z_LVAL in assignment as Z_BVAL contains a (zend_bool) cast
pollita: Catch signature change in zend_unmangle_property_name() -- Thanks steph</notes>
</release>
<release>
<date>2006-06-06</date>
<version>
<release>0.9</release>
<api>0.8</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>Allow building part of runkit while leaving other functionality out.
--enable-runkit works as before, building all runkit features
Individual features may enabled or disable by using
--enable-runkit-featurename or --disbale-runkit-featurename
where featurename is any of:
modify - Runtime manipulation
super - Superglobal registration
sandbox - Sandboxing
Ex: ./configure --enable-runkit --disable-runkit-modify
Enable superglobal registration and sandbox support,
but disable runtime manipulation.
./configure --disable-runkit --enable-runkit-sandbox
Enable only sandboxing support.
This release also:
- Fixes PHP4 (ZE1) compilation
- Closes a potential crash-bug in runkit_import()
handling of default properties
- Resolves an output buffering bug in Runkit_Sandbox
- Resolves Runkit_Sandbox failure when superglobals are defined</notes>
</release>
<release>
<date>2006-05-20</date>
<version>
<release>0.8.1</release>
<api>0.8</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>Added source file runkit_props.c to package</notes>
</release>
<release>
<date>2006-05-14</date>
<version>
<release>0.8</release>
<api>0.8</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<license uri="http://www.php.net/license">PHP</license>
<notes>Fixed SAPI handlers for genuinely threaded webservers (e.g. apache2-worker)
Fixed internal pointer corruption in function/class popping
Added functions:
runkit_zval_inspect()
runkit_return_value_used()
runkit_default_property_add()
Implemented class property importing in runkit_import()
Began refactor for PHP6 compatability
</notes>
</release>
<release>
<version>
<release>0.7</release>
<api>0.7</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-10-30</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Primarily bugfix release, only new functionality is expanded parent_scope setting.
Workaround bug when using runkit_import() with opcode caches by bypassing cache for imported file.
Fix using runkit_import() with multiple classes (Thanks to Stuart Herbert for the patch)
Fix various reference issues for parameters passed to manipulation functions.
Fix C++ compatability in sandbox source files.
Fix parent_scope support (was only applied to property_read and eval/include/require ops)
Expand parent_scope setting to allow variable arrays as symbol tables.
</notes>
</release>
<release>
<version>
<release>0.6</release>
<api>0.6</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-09-30</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Add ability to modify/rename/remove internal functions.
Requires PHP_INI_SYSTEM setting runkit.internal_override to be enabled.
Implement Runkit_Sandbox_Parent to give child access to parent&apos;s scope
Parent must enable $sandbox[&apos;parent_access&apos;] at minimum.
Additional boolean settings include:
parent_read - Can read properties in parent_scope
parent_write - Can modify properties in parent_scope
parent_call - Can call parent&apos;s functions
parent_eval - Can eval arbitrary code in parent scope
parent_include - Can include/require code in parent scope
parent_echo - Can echo/print data (bypass output_handler)
parent_die - Can kill parent (commiting suicide in the process)
A special parent_scope setting modifies the active symbol table of the parent
as seen from the child according to:
0 = Global Scope
1 = Current active symbol table
2 = Previously active symbol table
3 = The one before that...etc...
</notes>
</release>
<release>
<version>
<release>0.5</release>
<api>0.5</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-09-23</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>NOTICE: This release demotes runkit_sandbox_output_handler() to DEPRECATED.
Use $sandbox[&apos;output_handler&apos;] = $handler; rather than
runkit_sandbox_output_handler($sandbox, $handler);
The procedural version will be removed prior to a 1.0-stable release.
Other changes include:
- Major refactor of Runkit_Sandbox OOP Model.
- Addition of $sandbox[&apos;active&apos;] R/O status indicator.
- Fixed crash when multiple autoglobals are specified
</notes>
</release>
<release>
<version>
<release>0.4</release>
<api>0.4</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-07-08</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Added runkit_object_id() -- Fetch object handle identifier
Fixed runkit_import() -- Fold case when adding method keys to ce-&gt;function_table
Fixed runkit_method_*() to properly return TRUE on success
Refactored INI overrides in Runkit_Sandbox for readability
Added INI overrides in Runkit_Sandbox (safe_mode_gid,safe_mode_include_dir)
Fixed callback parameter to runkit_sandbox_output_handler() to be optional.
</notes>
</release>
<release>
<version>
<release>0.3.0</release>
<api>0.3.0</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-06-03</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Put php_runkit.h back into the package.xml file. (pear install runkit-beta should work now).
Implement die(), exit(), echo(), and print() and catch bailouts properly.
Implement output capturing -- runkit_sandbox_output_handler().
</notes>
</release>
<release>
<version>
<release>0.2.0</release>
<api>0.2.0</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-05-03</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Numerous build fixes in older versions and Win32.
Fix registration of more than one superglobal.
Implement include(), require(), include_once(), require_once(), unset(), isset(), and empty() support in Runkit_Sandbox.
Add runkit.superglobal as &quot;special&quot; ini supported by Runkit_Sandbox.
Fix runkit_class_*.phpt regression tests to be version agnostic.
</notes>
</release>
<release>
<version>
<release>0.1.0</release>
<api>0.1.0</api>
</version>
<stability>
<release>beta</release>
<api>beta</api>
</stability>
<date>2005-04-29</date>
<license uri="http://www.php.net/license">PHP</license>
<notes>Initial Release
</notes>
</release>
</changelog>
</package>
Jump to Line
Something went wrong with that request. Please try again.