summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMáté Kocsis <kocsismate@woohoolabs.com>2019-11-20 02:26:39 +0100
committerMáté Kocsis <kocsismate@woohoolabs.com>2019-12-05 08:31:43 +0100
commitad4d6634f49bfb6ce382e9b9a3d50492d41687ea (patch)
tree22cc911704e6cb62d563451270f497421f8a4cf4
parent04deb532f033db5c1707ca4b1842f718cc841337 (diff)
downloadphp-git-ad4d6634f49bfb6ce382e9b9a3d50492d41687ea.tar.gz
Promote warnings to exceptions in settype() function
-rw-r--r--Zend/tests/settype_resource.phptbin1579 -> 1190 bytes
-rw-r--r--ext/standard/tests/general_functions/gettype_settype_basic.phpt106
-rw-r--r--ext/standard/tests/general_functions/gettype_settype_error.phpt12
-rw-r--r--ext/standard/tests/general_functions/gettype_settype_variation5.phpt263
-rw-r--r--ext/standard/tests/general_functions/type.phpt33
-rw-r--r--ext/standard/type.c6
6 files changed, 135 insertions, 285 deletions
diff --git a/Zend/tests/settype_resource.phpt b/Zend/tests/settype_resource.phpt
index a6721cb757..1b038613f3 100644
--- a/Zend/tests/settype_resource.phpt
+++ b/Zend/tests/settype_resource.phpt
Binary files differ
diff --git a/ext/standard/tests/general_functions/gettype_settype_basic.phpt b/ext/standard/tests/general_functions/gettype_settype_basic.phpt
index fac0327ad5..80d12588e1 100644
--- a/ext/standard/tests/general_functions/gettype_settype_basic.phpt
+++ b/ext/standard/tests/general_functions/gettype_settype_basic.phpt
@@ -93,14 +93,19 @@ foreach ($types as $type) {
$loop_count = 1;
foreach ($values as $var) {
echo "-- Iteration $loop_count --\n"; $loop_count ++;
- // set to new type
- var_dump( settype($var, $type) );
- // dump the var
- var_dump( $var );
+ try {
+ // set to new type
+ var_dump( settype($var, $type) );
- // check the new type
- var_dump( gettype($var) );
+ // dump the var
+ var_dump( $var );
+
+ // check the new type
+ var_dump( gettype($var) );
+ } catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+ }
}
}
@@ -539,94 +544,33 @@ string(7) "boolean"
-- Setting type of data to resource --
-- Iteration 1 --
-2: settype(): Cannot convert to resource type
-bool(false)
-array(3) {
- [0]=>
- int(1)
- [1]=>
- int(2)
- [2]=>
- int(3)
-}
-string(5) "array"
+Cannot convert to resource type
-- Iteration 2 --
-2: settype(): Cannot convert to resource type
-bool(false)
-string(14) "another string"
-string(6) "string"
+Cannot convert to resource type
-- Iteration 3 --
-2: settype(): Cannot convert to resource type
-bool(false)
-array(3) {
- [0]=>
- int(2)
- [1]=>
- int(3)
- [2]=>
- int(4)
-}
-string(5) "array"
+Cannot convert to resource type
-- Iteration 4 --
-2: settype(): Cannot convert to resource type
-bool(false)
-int(1)
-string(7) "integer"
+Cannot convert to resource type
-- Iteration 5 --
-2: settype(): Cannot convert to resource type
-bool(false)
-int(-20)
-string(7) "integer"
+Cannot convert to resource type
-- Iteration 6 --
-2: settype(): Cannot convert to resource type
-bool(false)
-float(2.54)
-string(6) "double"
+Cannot convert to resource type
-- Iteration 7 --
-2: settype(): Cannot convert to resource type
-bool(false)
-float(-2.54)
-string(6) "double"
+Cannot convert to resource type
-- Iteration 8 --
-2: settype(): Cannot convert to resource type
-bool(false)
-NULL
-string(4) "NULL"
+Cannot convert to resource type
-- Iteration 9 --
-2: settype(): Cannot convert to resource type
-bool(false)
-bool(false)
-string(7) "boolean"
+Cannot convert to resource type
-- Iteration 10 --
-2: settype(): Cannot convert to resource type
-bool(false)
-string(11) "some string"
-string(6) "string"
+Cannot convert to resource type
-- Iteration 11 --
-2: settype(): Cannot convert to resource type
-bool(false)
-string(6) "string"
-string(6) "string"
+Cannot convert to resource type
-- Iteration 12 --
-2: settype(): Cannot convert to resource type
-bool(false)
-resource(%d) of type (stream)
-string(8) "resource"
+Cannot convert to resource type
-- Iteration 13 --
-2: settype(): Cannot convert to resource type
-bool(false)
-resource(%d) of type (stream)
-string(8) "resource"
+Cannot convert to resource type
-- Iteration 14 --
-2: settype(): Cannot convert to resource type
-bool(false)
-object(point)#1 (2) {
- ["x"]=>
- int(10)
- ["y"]=>
- int(20)
-}
-string(6) "object"
+Cannot convert to resource type
-- Setting type of data to array --
-- Iteration 1 --
diff --git a/ext/standard/tests/general_functions/gettype_settype_error.phpt b/ext/standard/tests/general_functions/gettype_settype_error.phpt
index e204c64d4c..e310f9e0ac 100644
--- a/ext/standard/tests/general_functions/gettype_settype_error.phpt
+++ b/ext/standard/tests/general_functions/gettype_settype_error.phpt
@@ -16,15 +16,17 @@ echo "**** Testing gettype() and settype() functions ****\n";
echo "\n*** Testing settype(): error conditions ***\n";
// passing an invalid type to set
-var_dump( settype( $var, "unknown" ) );
+try {
+ settype( $var, "unknown" );
+} catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+}
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
**** Testing gettype() and settype() functions ****
*** Testing settype(): error conditions ***
-
-Warning: settype(): Invalid type in %s on line %d
-bool(false)
+Invalid type
Done
diff --git a/ext/standard/tests/general_functions/gettype_settype_variation5.phpt b/ext/standard/tests/general_functions/gettype_settype_variation5.phpt
index 6437baa10b..f9f0059bfa 100644
--- a/ext/standard/tests/general_functions/gettype_settype_variation5.phpt
+++ b/ext/standard/tests/general_functions/gettype_settype_variation5.phpt
@@ -24,17 +24,6 @@ precision=14
dump the variable to see its new data
get the new type of the variable
*/
-
-/* function to handle catchable errors */
-function foo($errno, $errstr, $errfile, $errline) {
-// var_dump($errstr);
- // print error no and error string
- echo "$errno: $errstr\n";
-}
-//set the error handler, this is required as
-// settype() would fail with catachable fatal error
-set_error_handler("foo");
-
$var1 = "another string";
$var2 = array(2,3,4);
@@ -63,7 +52,7 @@ $var_values = array (
true,
/* strings */
- "\xFF",
+ "\$",
"\x66",
"\0123",
"",
@@ -159,286 +148,246 @@ foreach ($var_values as $var) {
// get the current data type
var_dump( gettype($var) );
- // convert it to null
- var_dump( settype($var, $type) );
+ // convert it to resource
+ try {
+ var_dump(settype($var, $type));
+ } catch (ValueError $exception) {
+ echo $exception->getMessage() . "\n";
+ }
// dump the converted data
- var_dump( $var );
+ var_dump($var);
// check the new type after conversion
- var_dump( gettype($var) );
+ var_dump(gettype($var));
}
echo "Done\n";
?>
---EXPECTF--
+--EXPECT--
*** Testing gettype() & settype() functions : usage variations ***
-- Setting type of data to resource --
-- Iteration 1 --
string(4) "NULL"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
NULL
string(4) "NULL"
-- Iteration 2 --
string(7) "boolean"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
bool(false)
string(7) "boolean"
-- Iteration 3 --
string(7) "boolean"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
bool(true)
string(7) "boolean"
-- Iteration 4 --
string(7) "boolean"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
bool(true)
string(7) "boolean"
-- Iteration 5 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
-string(1) "ÿ"
+Cannot convert to resource type
+string(1) "$"
string(6) "string"
-- Iteration 6 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(1) "f"
string(6) "string"
-- Iteration 7 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) "
3"
string(6) "string"
-- Iteration 8 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(0) ""
string(6) "string"
-- Iteration 9 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(0) ""
string(6) "string"
-- Iteration 10 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(1) " "
string(6) "string"
-- Iteration 11 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(1) " "
string(6) "string"
-- Iteration 12 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) "10"
string(6) "string"
-- Iteration 13 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) "10"
string(6) "string"
-- Iteration 14 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(8) "10string"
string(6) "string"
-- Iteration 15 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(8) "10string"
string(6) "string"
-- Iteration 16 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(1) "1"
string(6) "string"
-- Iteration 17 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) "-1"
string(6) "string"
-- Iteration 18 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(3) "1e2"
string(6) "string"
-- Iteration 19 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) " 1"
string(6) "string"
-- Iteration 20 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(22) "2974394749328742328432"
string(6) "string"
-- Iteration 21 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "-1e-2"
string(6) "string"
-- Iteration 22 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(1) "1"
string(6) "string"
-- Iteration 23 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) "-1"
string(6) "string"
-- Iteration 24 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(3) "1e2"
string(6) "string"
-- Iteration 25 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(2) " 1"
string(6) "string"
-- Iteration 26 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(22) "2974394749328742328432"
string(6) "string"
-- Iteration 27 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "-1e-2"
string(6) "string"
-- Iteration 28 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(4) "0xff"
string(6) "string"
-- Iteration 29 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(4) "0x55"
string(6) "string"
-- Iteration 30 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "0XA55"
string(6) "string"
-- Iteration 31 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "0X123"
string(6) "string"
-- Iteration 32 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(4) "0123"
string(6) "string"
-- Iteration 33 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(4) "0123"
string(6) "string"
-- Iteration 34 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "-0123"
string(6) "string"
-- Iteration 35 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "+0123"
string(6) "string"
-- Iteration 36 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "-0123"
string(6) "string"
-- Iteration 37 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(5) "+0123"
string(6) "string"
-- Iteration 38 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(8) "-0x80001"
string(6) "string"
-- Iteration 39 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(8) "+0x80001"
string(6) "string"
-- Iteration 40 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(10) "-0x80001.5"
string(6) "string"
-- Iteration 41 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(9) "0x80001.5"
string(6) "string"
-- Iteration 42 --
string(6) "string"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
string(12) "@$%#$%^$%^&^"
string(6) "string"
-- Iteration 43 --
string(5) "array"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
array(0) {
}
string(5) "array"
-- Iteration 44 --
string(5) "array"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
array(1) {
[0]=>
NULL
@@ -446,8 +395,7 @@ array(1) {
string(5) "array"
-- Iteration 45 --
string(5) "array"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
array(4) {
[0]=>
int(1)
@@ -461,8 +409,7 @@ array(4) {
string(5) "array"
-- Iteration 46 --
string(5) "array"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
array(4) {
[1]=>
string(3) "one"
@@ -476,8 +423,7 @@ array(4) {
string(5) "array"
-- Iteration 47 --
string(5) "array"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
array(3) {
[0]=>
float(1.5)
@@ -489,176 +435,147 @@ array(3) {
string(5) "array"
-- Iteration 48 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-2147483648)
string(6) "double"
-- Iteration 49 --
string(7) "integer"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
int(2147483647)
string(7) "integer"
-- Iteration 50 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(2147483649)
string(6) "double"
-- Iteration 51 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(1232147483649)
string(6) "double"
-- Iteration 52 --
string(7) "integer"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
int(85)
string(7) "integer"
-- Iteration 53 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(1058513956921)
string(6) "double"
-- Iteration 54 --
string(7) "integer"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
int(-21903)
string(7) "integer"
-- Iteration 55 --
string(7) "integer"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
int(365)
string(7) "integer"
-- Iteration 56 --
string(7) "integer"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
int(-365)
string(7) "integer"
-- Iteration 57 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(80561044571754)
string(6) "double"
-- Iteration 58 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(100000)
string(6) "double"
-- Iteration 59 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-100000)
string(6) "double"
-- Iteration 60 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(100000)
string(6) "double"
-- Iteration 61 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-100000)
string(6) "double"
-- Iteration 62 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-1.5)
string(6) "double"
-- Iteration 63 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(0.5)
string(6) "double"
-- Iteration 64 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-0.5)
string(6) "double"
-- Iteration 65 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(500000)
string(6) "double"
-- Iteration 66 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-500000)
string(6) "double"
-- Iteration 67 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-5.0E-7)
string(6) "double"
-- Iteration 68 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(500000)
string(6) "double"
-- Iteration 69 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-500000)
string(6) "double"
-- Iteration 70 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(512000)
string(6) "double"
-- Iteration 71 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-512000)
string(6) "double"
-- Iteration 72 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(5.12E-7)
string(6) "double"
-- Iteration 73 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(5.12E-7)
string(6) "double"
-- Iteration 74 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(512000)
string(6) "double"
-- Iteration 75 --
string(6) "double"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
float(-512000)
string(6) "double"
-- Iteration 76 --
string(6) "object"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
object(point)#1 (2) {
["x"]=>
NULL
@@ -668,8 +585,7 @@ object(point)#1 (2) {
string(6) "object"
-- Iteration 77 --
string(6) "object"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
object(point)#2 (2) {
["x"]=>
float(2.5)
@@ -679,8 +595,7 @@ object(point)#2 (2) {
string(6) "object"
-- Iteration 78 --
string(6) "object"
-2: settype(): Cannot convert to resource type
-bool(false)
+Cannot convert to resource type
object(point)#3 (2) {
["x"]=>
int(0)
diff --git a/ext/standard/tests/general_functions/type.phpt b/ext/standard/tests/general_functions/type.phpt
index 0b460b08d1..342b353baf 100644
--- a/ext/standard/tests/general_functions/type.phpt
+++ b/ext/standard/tests/general_functions/type.phpt
@@ -160,8 +160,7 @@ bool(true)
bool(true)
bool(true)
bool(true)
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
array(3) {
[0]=>
int(1)
@@ -170,11 +169,9 @@ array(3) {
[2]=>
int(3)
}
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
string(14) "another string"
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
array(3) {
[0]=>
int(2)
@@ -183,29 +180,21 @@ array(3) {
[2]=>
int(4)
}
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
int(1)
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
float(2)
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
NULL
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
-bool(false)
-string(42) "settype(): Cannot convert to resource type"
+Error: Cannot convert to resource type
bool(false)
+Error: Cannot convert to resource type
string(11) "some string"
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
resource(%d) of type (Unknown)
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
resource(%d) of type (stream)
-string(42) "settype(): Cannot convert to resource type"
-bool(false)
+Error: Cannot convert to resource type
object(stdClass)#%d (0) {
}
bool(true)
diff --git a/ext/standard/type.c b/ext/standard/type.c
index af847bf352..b794937b88 100644
--- a/ext/standard/type.c
+++ b/ext/standard/type.c
@@ -82,11 +82,11 @@ PHP_FUNCTION(settype)
zval_ptr_dtor(&tmp);
}
if (zend_string_equals_literal_ci(type, "resource")) {
- php_error_docref(NULL, E_WARNING, "Cannot convert to resource type");
+ zend_value_error("Cannot convert to resource type");
} else {
- php_error_docref(NULL, E_WARNING, "Invalid type");
+ zend_value_error("Invalid type");
}
- RETURN_FALSE;
+ return;
}
if (ptr == &tmp) {