summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gdbinit72
-rw-r--r--NEWS27
-rw-r--r--Zend/tests/bug63173.phpt12
-rw-r--r--Zend/tests/bug63219.phpt18
-rw-r--r--Zend/zend_compile.c14
-rw-r--r--Zend/zend_vm_def.h4
-rw-r--r--Zend/zend_vm_execute.h16
-rw-r--r--configure.in2
-rw-r--r--ext/curl/streams.c4
-rw-r--r--ext/date/lib/parse_date.c100
-rw-r--r--ext/date/lib/parse_date.re2
-rw-r--r--ext/date/lib/timezonedb.h1200
-rw-r--r--ext/date/tests/bug62561.phpt16
-rw-r--r--ext/date/tests/bug62896.phpt40
-rw-r--r--ext/gd/gd.c5
-rw-r--r--ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt38
-rw-r--r--ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt26
-rw-r--r--ext/standard/tests/network/gethostbyname_basic001.phpt1
-rw-r--r--ext/standard/tests/network/gethostbyname_basic002.phpt15
-rw-r--r--ext/standard/tests/network/gethostbyname_error004.phpt1
-rw-r--r--ext/standard/tests/network/getmxrr.phpt1
-rw-r--r--ext/standard/tests/serialize/bug35895.phpt24
-rw-r--r--ext/standard/tests/url/bug63162.phpt38
-rw-r--r--ext/standard/url.c2
-rw-r--r--ext/standard/var.c8
-rw-r--r--main/php_version.h6
-rwxr-xr-xrun-tests.php5
-rw-r--r--sapi/fpm/config.m46
-rw-r--r--sapi/fpm/fpm/fpm.c6
-rw-r--r--sapi/fpm/fpm/fpm.h4
-rw-r--r--sapi/fpm/fpm/fpm_conf.c11
-rw-r--r--sapi/fpm/fpm/fpm_conf.h2
-rw-r--r--sapi/fpm/fpm/fpm_main.c34
-rw-r--r--sapi/fpm/fpm/fpm_signals.c12
-rw-r--r--sapi/fpm/fpm/fpm_signals.h3
-rw-r--r--sapi/fpm/fpm/fpm_status.c18
-rw-r--r--sapi/fpm/fpm/fpm_unix.c91
-rw-r--r--sapi/fpm/init.d.php-fpm.in4
-rw-r--r--sapi/fpm/php-fpm.8.in23
-rw-r--r--sapi/fpm/php-fpm.service.in12
40 files changed, 1127 insertions, 796 deletions
diff --git a/.gdbinit b/.gdbinit
index 4a26d9608b..e7a565dfa9 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1,6 +1,19 @@
+define set_ts
+ set $tsrm_ls = $arg0
+end
+
+document set_ts
+ set the ts resource, it is impossible for gdb to
+ call ts_resource_ex while no process is running,
+ but we could get the resource from the argument
+ of frame info.
+end
+
define ____executor_globals
if basic_functions_module.zts
- set $tsrm_ls = ts_resource_ex(0, 0)
+ if !$tsrm_ls
+ set $tsrm_ls = ts_resource_ex(0, 0)
+ end
set $eg = ((zend_executor_globals*) (*((void ***) $tsrm_ls))[executor_globals_id-1])
set $cg = ((zend_compiler_globals*) (*((void ***) $tsrm_ls))[compiler_globals_id-1])
else
@@ -38,12 +51,53 @@ define dump_bt
set $t = $arg0
while $t
printf "[%p] ", $t
- if $t->function_state.function->common.function_name
- if $t->function_state.arguments
- set $count = (int)*($t->function_state.arguments)
- printf "%s(", $t->function_state.function->common.function_name
+ set $fst = $t->function_state
+ if $fst.function->common.function_name
+ if $fst.arguments
+ set $count = (int)*($fst.arguments)
+
+ if $t->object
+ if $fst.function.common.scope
+ printf "%s->", $fst.function.common.scope->name
+ else
+ if !$eg
+ ____executor_globals
+ end
+
+ set $known_class = 0
+ if $eg
+ set $handle = $t->object.value.obj.handle
+ set $handlers = $t->object.value.obj.handlers
+ set $zobj = (zend_object *)$eg.objects_store.object_buckets[$handle].bucket.obj.object
+
+ if $handlers->get_class_entry == &zend_std_object_get_class
+ set $known_class = 1
+
+ if $handlers.get_class_name
+ if $handlers.get_class_name != &zend_std_object_get_class_name
+ set $known_class = 0
+ end
+ end
+
+ if $known_class
+ printf "%s->", $zobj->ce.name
+ end
+ end
+ end
+
+ if !$known_class
+ printf "(Unknown)->"
+ end
+ end
+ else
+ if $fst.function.common.scope
+ printf "%s::", $fst.function.common.scope->name
+ end
+ end
+
+ printf "%s(", $fst.function->common.function_name
while $count > 0
- set $zvalue = *(zval **)($t->function_state.arguments - $count)
+ set $zvalue = *(zval **)($fst.arguments - $count)
set $type = $zvalue->type
if $type == 0
printf "NULL"
@@ -73,7 +127,7 @@ define dump_bt
if $type == 7
printf "resource(#%d)", $zvalue->value.lval
end
- if $type == 8
+ if $type == 8
printf "constant"
end
if $type == 9
@@ -89,7 +143,7 @@ define dump_bt
end
printf ") "
else
- printf "%s() ", $t->function_state.function->common.function_name
+ printf "%s() ", $fst.function->common.function_name
end
else
printf "??? "
@@ -600,7 +654,7 @@ define zmemcheck
end
end
if $not_found
- printf "no such block that begins at %p.\n", $aptr
+ printf "no such block that begins at %p.\n", $aptr
end
if $arg0 == 0
printf "-------------------------------------------------------------------------------\n"
diff --git a/NEWS b/NEWS
index 3a5cf669b3..fcd3bdd529 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,7 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+?? ??? 2012, PHP 5.4.9
+
?? ??? 2012, PHP 5.4.8
- CLI server:
@@ -9,9 +11,13 @@ PHP NEWS
(Lars)
- Core:
+ . Fixed bug #63219 (Segfault when aliasing trait method when autoloader
+ throws excpetion). (Laruence)
. Added optional second argument for assert() to specify custom message. Patch
by Lonny Kapelushnik (lonny@lonnylot.com). (Lars)
. Support building PHP with the native client toolchain. (Stuart Langley)
+ . Added --offline option for tests. (Remi)
+ . Fixed bug #63162 (parse_url does not match password component). (husman)
. Fixed bug #63111 (is_callable() lies for abstract static method). (Dmitry)
. Fixed bug #63093 (Segfault while load extension failed in zts-build).
(Laruence)
@@ -25,11 +31,28 @@ PHP NEWS
. Fixed bug #60909 (custom error handler throwing Exception + fatal error
= no shutdown function). (Dmitry)
. Fixed bug #60723 (error_log error time has changed to UTC ignoring default
- timezo). (Laruence)
+ timezone). (Laruence)
+
+- cURL:
+ . Fixed bug #62085 (file_get_contents a remote file by Curl wrapper will
+ cause cpu Soaring). (Pierrick)
+
+- Date:
+ . Fixed bug #62896 ("DateTime->modify('+0 days')" modifies DateTime object)
+ (Lonny Kapelushnik)
+ . Fixed bug #62561 (DateTime add 'P1D' adds 25 hours). (Lonny Kapelushnik)
- DOM:
. Fixed bug #63015 (Incorrect arginfo for DOMErrorHandler). (Rob)
+- FPM:
+ . Fixed bug #62954 (startup problems fpm / php-fpm). (fat)
+ . Fixed bug #62886 (PHP-FPM may segfault/hang on startup). (fat)
+ . Fixed bug #63085 (Systemd integration and daemonize). (remi, fat)
+ . Fixed bug #62947 (Unneccesary warnings on FPM). (fat)
+ . Fixed bug #62887 (Only /status?plain&full gives "last request cpu"). (fat)
+ . Fixed bug #62216 (Add PID to php-fpm init.d script). (fat)
+
- OpenSSL:
. Implemented FR #61421 (OpenSSL signature verification missing RMD160,
SHA224, SHA256, SHA384, SHA512). (Mark Jones)
@@ -54,7 +77,7 @@ PHP NEWS
. Fixed bug #63000 (MCAST_JOIN_GROUP on OSX is broken, merge of PR 185 by
Igor Wiedler). (Lars)
-?? ??? 2012, PHP 5.4.7
+13 Sep 2012, PHP 5.4.7
- Core:
. Fixed bug (segfault while build with zts and GOTO vm-kind). (Laruence)
diff --git a/Zend/tests/bug63173.phpt b/Zend/tests/bug63173.phpt
new file mode 100644
index 0000000000..36ebf203d2
--- /dev/null
+++ b/Zend/tests/bug63173.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Bug #63173: Crash when invoking invalid array callback
+--FILE--
+<?php
+
+// the important part here are the indexes 1 and 2
+$callback = [1 => 0, 2 => 0];
+$callback();
+
+?>
+--EXPECTF--
+Fatal error: Array callback has to contain indices 0 and 1 in %s on line %d
diff --git a/Zend/tests/bug63219.phpt b/Zend/tests/bug63219.phpt
new file mode 100644
index 0000000000..999be4a853
--- /dev/null
+++ b/Zend/tests/bug63219.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #63219 (Segfault when aliasing trait method when autoloader throws excpetion)
+--FILE--
+<?php
+trait TFoo {
+ public function fooMethod(){}
+}
+
+class C {
+ use TFoo {
+ Typo::fooMethod as tf;
+ }
+}
+
+echo "okey";
+?>
+--EXPECTF--
+Fatal error: Could not find trait Typo in %sbug63219.php on line %d
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index c39d8eaa1e..303eedb6bc 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3975,8 +3975,10 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
/** Resolve classes for all precedence operations. */
if (cur_precedence->exclude_from_classes) {
cur_method_ref = cur_precedence->trait_method;
- cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name,
- cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+ if (!(cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len,
+ ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+ zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name);
+ }
/** Ensure that the prefered method is actually available. */
lcname = zend_str_tolower_dup(cur_method_ref->method_name,
@@ -4003,7 +4005,9 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
char* class_name = (char*)cur_precedence->exclude_from_classes[j];
zend_uint name_length = strlen(class_name);
- cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+ if (!(cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+ zend_error(E_COMPILE_ERROR, "Could not find trait %s", class_name);
+ }
/* make sure that the trait method is not from a class mentioned in
exclude_from_classes, for consistency */
@@ -4030,7 +4034,9 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /*
/** For all aliases with an explicit class name, resolve the class now. */
if (ce->trait_aliases[i]->trait_method->class_name) {
cur_method_ref = ce->trait_aliases[i]->trait_method;
- cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC);
+ if (!(cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) {
+ zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name);
+ }
/** And, ensure that the referenced method is resolvable, too. */
lcname = zend_str_tolower_dup(cur_method_ref->method_name,
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index f5567ea990..9d475a688c 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2412,6 +2412,10 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
+ if (!obj || !method) {
+ zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ }
+
if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 78f3d8496d..4abe6503cd 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1256,6 +1256,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE
zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
+ if (!obj || !method) {
+ zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ }
+
if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
}
@@ -1558,6 +1562,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H
zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
+ if (!obj || !method) {
+ zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ }
+
if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
}
@@ -1722,6 +1730,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
+ if (!obj || !method) {
+ zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ }
+
if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
}
@@ -1919,6 +1931,10 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA
zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
+ if (!obj || !method) {
+ zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
+ }
+
if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
}
diff --git a/configure.in b/configure.in
index b03f6cc8c0..afe470d30a 100644
--- a/configure.in
+++ b/configure.in
@@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...);
PHP_MAJOR_VERSION=5
PHP_MINOR_VERSION=4
-PHP_RELEASE_VERSION=8
+PHP_RELEASE_VERSION=9
PHP_EXTRA_VERSION="-dev"
PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION"
PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION`
diff --git a/ext/curl/streams.c b/ext/curl/streams.c
index 19328d886c..821c2ecad8 100644
--- a/ext/curl/streams.c
+++ b/ext/curl/streams.c
@@ -162,6 +162,10 @@ static size_t php_curl_stream_read(php_stream *stream, char *buf, size_t count T
}
do {
+ FD_ZERO(&curlstream->readfds);
+ FD_ZERO(&curlstream->writefds);
+ FD_ZERO(&curlstream->excfds);
+
/* get the descriptors from curl */
curl_multi_fdset(curlstream->multi, &curlstream->readfds, &curlstream->writefds, &curlstream->excfds, &curlstream->maxfd);
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index 964f10d912..4829da6c91 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Mon Dec 5 22:02:27 2011 */
+/* Generated by re2c 0.13.5 on Sun Sep 30 20:14:42 2012 */
#line 1 "ext/date/lib/parse_date.re"
/*
+----------------------------------------------------------------------+
@@ -995,7 +995,7 @@ std:
}
yy2:
YYDEBUG(2, *YYCURSOR);
-#line 1082 "ext/date/lib/parse_date.re"
+#line 1083 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("firstdayof | lastdayof");
TIMELIB_INIT;
@@ -1034,7 +1034,7 @@ yy3:
}
yy4:
YYDEBUG(4, *YYCURSOR);
-#line 1676 "ext/date/lib/parse_date.re"
+#line 1677 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("tzcorrection | tz");
@@ -1358,7 +1358,7 @@ yy12:
if (yych <= '9') goto yy1385;
yy13:
YYDEBUG(13, *YYCURSOR);
-#line 1771 "ext/date/lib/parse_date.re"
+#line 1772 "ext/date/lib/parse_date.re"
{
add_error(s, "Unexpected character");
goto std;
@@ -2420,7 +2420,7 @@ yy49:
if (yych <= '9') goto yy55;
yy50:
YYDEBUG(50, *YYCURSOR);
-#line 1760 "ext/date/lib/parse_date.re"
+#line 1761 "ext/date/lib/parse_date.re"
{
goto std;
}
@@ -2433,7 +2433,7 @@ yy52:
YYDEBUG(52, *YYCURSOR);
++YYCURSOR;
YYDEBUG(53, *YYCURSOR);
-#line 1765 "ext/date/lib/parse_date.re"
+#line 1766 "ext/date/lib/parse_date.re"
{
s->pos = cursor; s->line++;
goto std;
@@ -2825,7 +2825,7 @@ yy72:
if (yych == 's') goto yy74;
yy73:
YYDEBUG(73, *YYCURSOR);
-#line 1744 "ext/date/lib/parse_date.re"
+#line 1745 "ext/date/lib/parse_date.re"
{
timelib_ull i;
DEBUG_OUTPUT("relative");
@@ -3602,7 +3602,7 @@ yy166:
}
yy167:
YYDEBUG(167, *YYCURSOR);
-#line 1607 "ext/date/lib/parse_date.re"
+#line 1608 "ext/date/lib/parse_date.re"
{
const timelib_relunit* relunit;
DEBUG_OUTPUT("daytext");
@@ -4139,7 +4139,7 @@ yy193:
}
yy194:
YYDEBUG(194, *YYCURSOR);
-#line 1666 "ext/date/lib/parse_date.re"
+#line 1667 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("monthtext");
TIMELIB_INIT;
@@ -4199,7 +4199,7 @@ yy198:
}
yy199:
YYDEBUG(199, *YYCURSOR);
-#line 1412 "ext/date/lib/parse_date.re"
+#line 1413 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("datetextual | datenoyear");
@@ -4481,7 +4481,7 @@ yy222:
}
yy223:
YYDEBUG(223, *YYCURSOR);
-#line 1714 "ext/date/lib/parse_date.re"
+#line 1715 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
@@ -5208,7 +5208,7 @@ yy278:
YYDEBUG(278, *YYCURSOR);
++YYCURSOR;
YYDEBUG(279, *YYCURSOR);
-#line 1690 "ext/date/lib/parse_date.re"
+#line 1691 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12");
TIMELIB_INIT;
@@ -5409,7 +5409,7 @@ yy294:
++YYCURSOR;
yy295:
YYDEBUG(295, *YYCURSOR);
-#line 1384 "ext/date/lib/parse_date.re"
+#line 1385 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("datenoday");
@@ -6642,7 +6642,7 @@ yy362:
if (yych <= '9') goto yy365;
yy364:
YYDEBUG(364, *YYCURSOR);
-#line 1528 "ext/date/lib/parse_date.re"
+#line 1529 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("pgtextshort");
@@ -7293,7 +7293,7 @@ yy392:
}
yy393:
YYDEBUG(393, *YYCURSOR);
-#line 1586 "ext/date/lib/parse_date.re"
+#line 1587 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("ago");
TIMELIB_INIT;
@@ -9063,7 +9063,7 @@ yy454:
++YYCURSOR;
yy455:
YYDEBUG(455, *YYCURSOR);
-#line 1289 "ext/date/lib/parse_date.re"
+#line 1290 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash");
TIMELIB_INIT;
@@ -9634,7 +9634,7 @@ yy475:
}
yy476:
YYDEBUG(476, *YYCURSOR);
-#line 1426 "ext/date/lib/parse_date.re"
+#line 1427 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("datenoyearrev");
TIMELIB_INIT;
@@ -9786,7 +9786,7 @@ yy488:
YYDEBUG(488, *YYCURSOR);
++YYCURSOR;
YYDEBUG(489, *YYCURSOR);
-#line 1144 "ext/date/lib/parse_date.re"
+#line 1145 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12");
TIMELIB_INIT;
@@ -9815,7 +9815,7 @@ yy490:
}
yy491:
YYDEBUG(491, *YYCURSOR);
-#line 1181 "ext/date/lib/parse_date.re"
+#line 1182 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
@@ -10150,7 +10150,7 @@ yy523:
YYDEBUG(523, *YYCURSOR);
++YYCURSOR;
YYDEBUG(524, *YYCURSOR);
-#line 1161 "ext/date/lib/parse_date.re"
+#line 1162 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("mssqltime");
TIMELIB_INIT;
@@ -10275,7 +10275,7 @@ yy534:
if (yych <= '9') goto yy541;
yy535:
YYDEBUG(535, *YYCURSOR);
-#line 1343 "ext/date/lib/parse_date.re"
+#line 1344 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("datefull");
@@ -11026,7 +11026,7 @@ yy605:
YYDEBUG(606, *YYCURSOR);
++YYCURSOR;
YYDEBUG(607, *YYCURSOR);
-#line 1358 "ext/date/lib/parse_date.re"
+#line 1359 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("pointed date YYYY");
TIMELIB_INIT;
@@ -11073,7 +11073,7 @@ yy611:
if (yych <= '9') goto yy605;
yy612:
YYDEBUG(612, *YYCURSOR);
-#line 1370 "ext/date/lib/parse_date.re"
+#line 1371 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("pointed date YY");
@@ -11727,7 +11727,7 @@ yy656:
}
yy657:
YYDEBUG(657, *YYCURSOR);
-#line 1329 "ext/date/lib/parse_date.re"
+#line 1330 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("gnudateshort");
@@ -11846,7 +11846,7 @@ yy666:
}
yy667:
YYDEBUG(667, *YYCURSOR);
-#line 1273 "ext/date/lib/parse_date.re"
+#line 1274 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("americanshort | american");
@@ -12094,7 +12094,7 @@ yy700:
if (yych <= ':') goto yy704;
yy701:
YYDEBUG(701, *YYCURSOR);
-#line 1556 "ext/date/lib/parse_date.re"
+#line 1557 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("clf");
@@ -12666,7 +12666,7 @@ yy763:
}
yy764:
YYDEBUG(764, *YYCURSOR);
-#line 1301 "ext/date/lib/parse_date.re"
+#line 1302 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("iso8601date2");
@@ -12718,7 +12718,7 @@ yy771:
YYDEBUG(771, *YYCURSOR);
++YYCURSOR;
YYDEBUG(772, *YYCURSOR);
-#line 1542 "ext/date/lib/parse_date.re"
+#line 1543 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("pgtextreverse");
@@ -12869,7 +12869,7 @@ yy783:
}
yy784:
YYDEBUG(784, *YYCURSOR);
-#line 1577 "ext/date/lib/parse_date.re"
+#line 1578 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("year4");
TIMELIB_INIT;
@@ -13028,7 +13028,7 @@ yy793:
}
yy794:
YYDEBUG(794, *YYCURSOR);
-#line 1398 "ext/date/lib/parse_date.re"
+#line 1399 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("datenodayrev");
@@ -13256,7 +13256,7 @@ yy814:
if (yych <= '7') goto yy817;
yy815:
YYDEBUG(815, *YYCURSOR);
-#line 1509 "ext/date/lib/parse_date.re"
+#line 1510 "ext/date/lib/parse_date.re"
{
timelib_sll w, d;
DEBUG_OUTPUT("isoweek");
@@ -13284,7 +13284,7 @@ yy817:
YYDEBUG(817, *YYCURSOR);
++YYCURSOR;
YYDEBUG(818, *YYCURSOR);
-#line 1490 "ext/date/lib/parse_date.re"
+#line 1491 "ext/date/lib/parse_date.re"
{
timelib_sll w, d;
DEBUG_OUTPUT("isoweekday");
@@ -13366,7 +13366,7 @@ yy821:
}
yy822:
YYDEBUG(822, *YYCURSOR);
-#line 1476 "ext/date/lib/parse_date.re"
+#line 1477 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("pgydotd");
@@ -13482,7 +13482,7 @@ yy842:
++YYCURSOR;
yy843:
YYDEBUG(843, *YYCURSOR);
-#line 1450 "ext/date/lib/parse_date.re"
+#line 1451 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif");
@@ -13769,7 +13769,7 @@ yy848:
}
yy849:
YYDEBUG(849, *YYCURSOR);
-#line 1438 "ext/date/lib/parse_date.re"
+#line 1439 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("datenocolon");
TIMELIB_INIT;
@@ -14700,7 +14700,7 @@ yy973:
if (yych <= '9') goto yy996;
yy974:
YYDEBUG(974, *YYCURSOR);
-#line 1315 "ext/date/lib/parse_date.re"
+#line 1316 "ext/date/lib/parse_date.re"
{
int length = 0;
DEBUG_OUTPUT("gnudateshorter");
@@ -15722,7 +15722,7 @@ yy1066:
}
yy1068:
YYDEBUG(1068, *YYCURSOR);
-#line 1207 "ext/date/lib/parse_date.re"
+#line 1208 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("gnunocolon");
TIMELIB_INIT;
@@ -15836,7 +15836,7 @@ yy1075:
}
yy1076:
YYDEBUG(1076, *YYCURSOR);
-#line 1253 "ext/date/lib/parse_date.re"
+#line 1254 "ext/date/lib/parse_date.re"
{
int tz_not_found;
DEBUG_OUTPUT("iso8601nocolon");
@@ -16753,7 +16753,7 @@ yy1117:
}
yy1118:
YYDEBUG(1118, *YYCURSOR);
-#line 1649 "ext/date/lib/parse_date.re"
+#line 1650 "ext/date/lib/parse_date.re"
{
timelib_sll i;
int behavior = 0;
@@ -16820,7 +16820,7 @@ yy1126:
YYDEBUG(1126, *YYCURSOR);
++YYCURSOR;
YYDEBUG(1127, *YYCURSOR);
-#line 1122 "ext/date/lib/parse_date.re"
+#line 1123 "ext/date/lib/parse_date.re"
{
timelib_sll i;
int behavior = 0;
@@ -16949,7 +16949,7 @@ yy1141:
}
yy1142:
YYDEBUG(1142, *YYCURSOR);
-#line 1625 "ext/date/lib/parse_date.re"
+#line 1626 "ext/date/lib/parse_date.re"
{
timelib_sll i;
int behavior = 0;
@@ -19649,7 +19649,7 @@ yy1294:
goto yy1298;
yy1295:
YYDEBUG(1295, *YYCURSOR);
-#line 1099 "ext/date/lib/parse_date.re"
+#line 1100 "ext/date/lib/parse_date.re"
{
DEBUG_OUTPUT("backof | frontof");
TIMELIB_INIT;
@@ -21382,11 +21382,12 @@ yy1387:
s->time->is_localtime = 1;
s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
s->time->z = 0;
+ s->time->dst = 0;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 21390 "ext/date/lib/parse_date.c"
+#line 21391 "ext/date/lib/parse_date.c"
yy1388:
YYDEBUG(1388, *YYCURSOR);
yych = *++YYCURSOR;
@@ -21833,7 +21834,7 @@ yy1417:
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 21837 "ext/date/lib/parse_date.c"
+#line 21838 "ext/date/lib/parse_date.c"
yy1418:
YYDEBUG(1418, *YYCURSOR);
yych = *++YYCURSOR;
@@ -21877,7 +21878,7 @@ yy1420:
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 21881 "ext/date/lib/parse_date.c"
+#line 21882 "ext/date/lib/parse_date.c"
yy1421:
YYDEBUG(1421, *YYCURSOR);
yych = *++YYCURSOR;
@@ -23897,7 +23898,7 @@ yy1500:
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 23901 "ext/date/lib/parse_date.c"
+#line 23902 "ext/date/lib/parse_date.c"
yy1501:
YYDEBUG(1501, *YYCURSOR);
yych = *++YYCURSOR;
@@ -24047,7 +24048,7 @@ yy1508:
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 24051 "ext/date/lib/parse_date.c"
+#line 24052 "ext/date/lib/parse_date.c"
yy1509:
YYDEBUG(1509, *YYCURSOR);
yyaccept = 0;
@@ -24591,7 +24592,7 @@ yy1531:
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
}
-#line 24595 "ext/date/lib/parse_date.c"
+#line 24596 "ext/date/lib/parse_date.c"
yy1532:
YYDEBUG(1532, *YYCURSOR);
yyaccept = 0;
@@ -24764,7 +24765,7 @@ yy1537:
goto yy1531;
}
}
-#line 1775 "ext/date/lib/parse_date.re"
+#line 1776 "ext/date/lib/parse_date.re"
}
@@ -25070,6 +25071,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
s->time->is_localtime = 1;
s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
s->time->z = 0;
+ s->time->dst = 0;
break;
case 'e': /* timezone */
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
index cca88580eb..5a8b6134b9 100644
--- a/ext/date/lib/parse_date.re
+++ b/ext/date/lib/parse_date.re
@@ -1073,6 +1073,7 @@ weekdayof = (reltextnumber|reltexttext) space (dayfull|dayabbr) space 'of
s->time->is_localtime = 1;
s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
s->time->z = 0;
+ s->time->dst = 0;
TIMELIB_DEINIT;
return TIMELIB_RELATIVE;
@@ -2077,6 +2078,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim
s->time->is_localtime = 1;
s->time->zone_type = TIMELIB_ZONETYPE_OFFSET;
s->time->z = 0;
+ s->time->dst = 0;
break;
case 'e': /* timezone */
diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h
index 221181191e..cee077bab4 100644
--- a/ext/date/lib/timezonedb.h
+++ b/ext/date/lib/timezonedb.h
@@ -14,570 +14,570 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[576] = {
{ "Africa/Bujumbura" , 0x000571 },
{ "Africa/Cairo" , 0x0005B5 },
{ "Africa/Casablanca" , 0x000878 },
- { "Africa/Ceuta" , 0x000A6C },
- { "Africa/Conakry" , 0x000D73 },
- { "Africa/Dakar" , 0x000DDE },
- { "Africa/Dar_es_Salaam" , 0x000E44 },
- { "Africa/Djibouti" , 0x000EB1 },
- { "Africa/Douala" , 0x000F06 },
- { "Africa/El_Aaiun" , 0x000F5B },
- { "Africa/Freetown" , 0x000FC1 },
- { "Africa/Gaborone" , 0x0010D0 },
- { "Africa/Harare" , 0x00112B },
- { "Africa/Johannesburg" , 0x001180 },
- { "Africa/Juba" , 0x0011EE },
- { "Africa/Kampala" , 0x001301 },
- { "Africa/Khartoum" , 0x001380 },
- { "Africa/Kigali" , 0x001493 },
- { "Africa/Kinshasa" , 0x0014E8 },
- { "Africa/Lagos" , 0x001543 },
- { "Africa/Libreville" , 0x001598 },
- { "Africa/Lome" , 0x0015ED },
- { "Africa/Luanda" , 0x001631 },
- { "Africa/Lubumbashi" , 0x001686 },
- { "Africa/Lusaka" , 0x0016E1 },
- { "Africa/Malabo" , 0x001736 },
- { "Africa/Maputo" , 0x00179C },
- { "Africa/Maseru" , 0x0017F1 },
- { "Africa/Mbabane" , 0x001859 },
- { "Africa/Mogadishu" , 0x0018AF },
- { "Africa/Monrovia" , 0x00190A },
- { "Africa/Nairobi" , 0x001970 },
- { "Africa/Ndjamena" , 0x0019EF },
- { "Africa/Niamey" , 0x001A5B },
- { "Africa/Nouakchott" , 0x001ACE },
- { "Africa/Ouagadougou" , 0x001B39 },
- { "Africa/Porto-Novo" , 0x001B8E },
- { "Africa/Sao_Tome" , 0x001BF4 },
- { "Africa/Timbuktu" , 0x001C49 },
- { "Africa/Tripoli" , 0x001CB4 },
- { "Africa/Tunis" , 0x001DAE },
- { "Africa/Windhoek" , 0x001EC0 },
- { "America/Adak" , 0x002107 },
- { "America/Anchorage" , 0x00247D },
- { "America/Anguilla" , 0x0027F1 },
- { "America/Antigua" , 0x002846 },
- { "America/Araguaina" , 0x0028AC },
- { "America/Argentina/Buenos_Aires" , 0x002A07 },
- { "America/Argentina/Catamarca" , 0x002BB5 },
- { "America/Argentina/ComodRivadavia" , 0x002D76 },
- { "America/Argentina/Cordoba" , 0x002F1C },
- { "America/Argentina/Jujuy" , 0x0030F1 },
- { "America/Argentina/La_Rioja" , 0x0032A5 },
- { "America/Argentina/Mendoza" , 0x00345D },
- { "America/Argentina/Rio_Gallegos" , 0x00361D },
- { "America/Argentina/Salta" , 0x0037D2 },
- { "America/Argentina/San_Juan" , 0x00397E },
- { "America/Argentina/San_Luis" , 0x003B36 },
- { "America/Argentina/Tucuman" , 0x003CFC },
- { "America/Argentina/Ushuaia" , 0x003EB8 },
- { "America/Aruba" , 0x004073 },
- { "America/Asuncion" , 0x0040D9 },
- { "America/Atikokan" , 0x0043BE },
- { "America/Atka" , 0x004494 },
- { "America/Bahia" , 0x0047FA },
- { "America/Bahia_Banderas" , 0x004A8C },
- { "America/Barbados" , 0x004D05 },
- { "America/Belem" , 0x004D9F },
- { "America/Belize" , 0x004E9A },
- { "America/Blanc-Sablon" , 0x005016 },
- { "America/Boa_Vista" , 0x0050CA },
- { "America/Bogota" , 0x0051D3 },
- { "America/Boise" , 0x00523F },
- { "America/Buenos_Aires" , 0x0055D6 },
- { "America/Cambridge_Bay" , 0x00576F },
- { "America/Campo_Grande" , 0x005A97 },
- { "America/Cancun" , 0x005D86 },
- { "America/Caracas" , 0x005FC8 },
- { "America/Catamarca" , 0x00602F },
- { "America/Cayenne" , 0x0061D5 },
- { "America/Cayman" , 0x006237 },
- { "America/Chicago" , 0x00628C },
- { "America/Chihuahua" , 0x0067A3 },
- { "America/Coral_Harbour" , 0x006A0E },
- { "America/Cordoba" , 0x006AA0 },
- { "America/Costa_Rica" , 0x006C46 },
- { "America/Creston" , 0x006CD0 },
- { "America/Cuiaba" , 0x006D5C },
- { "America/Curacao" , 0x00703A },
- { "America/Danmarkshavn" , 0x0070A0 },
- { "America/Dawson" , 0x0071E4 },
- { "America/Dawson_Creek" , 0x007501 },
- { "America/Denver" , 0x0076DB },
- { "America/Detroit" , 0x007A61 },
- { "America/Dominica" , 0x007DC0 },
- { "America/Edmonton" , 0x007E15 },
- { "America/Eirunepe" , 0x0081CD },
- { "America/El_Salvador" , 0x0082E0 },
- { "America/Ensenada" , 0x008355 },
- { "America/Fort_Wayne" , 0x0087FC },
- { "America/Fortaleza" , 0x0086BE },
- { "America/Glace_Bay" , 0x008A66 },
- { "America/Godthab" , 0x008DDD },
- { "America/Goose_Bay" , 0x0090A1 },
- { "America/Grand_Turk" , 0x00955E },
- { "America/Grenada" , 0x00980D },
- { "America/Guadeloupe" , 0x009862 },
- { "America/Guatemala" , 0x0098B7 },
- { "America/Guayaquil" , 0x009940 },
- { "America/Guyana" , 0x00999D },
- { "America/Halifax" , 0x009A1E },
- { "America/Havana" , 0x009F34 },
- { "America/Hermosillo" , 0x00A2A7 },
- { "America/Indiana/Indianapolis" , 0x00A385 },
- { "America/Indiana/Knox" , 0x00A616 },
- { "America/Indiana/Marengo" , 0x00A9AD },
- { "America/Indiana/Petersburg" , 0x00AC53 },
- { "America/Indiana/Tell_City" , 0x00B1A0 },
- { "America/Indiana/Vevay" , 0x00B439 },
- { "America/Indiana/Vincennes" , 0x00B674 },
- { "America/Indiana/Winamac" , 0x00B928 },
- { "America/Indianapolis" , 0x00AF36 },
- { "America/Inuvik" , 0x00BBE1 },
- { "America/Iqaluit" , 0x00BED8 },
- { "America/Jamaica" , 0x00C1FA },
- { "America/Jujuy" , 0x00C2BF },
- { "America/Juneau" , 0x00C469 },
- { "America/Kentucky/Louisville" , 0x00C7E7 },
- { "America/Kentucky/Monticello" , 0x00CC05 },
- { "America/Knox_IN" , 0x00CF8A },
- { "America/Kralendijk" , 0x00D2FB },
- { "America/La_Paz" , 0x00D361 },
- { "America/Lima" , 0x00D3C8 },
- { "America/Los_Angeles" , 0x00D470 },
- { "America/Louisville" , 0x00D881 },
- { "America/Lower_Princes" , 0x00DC76 },
- { "America/Maceio" , 0x00DCDC },
- { "America/Managua" , 0x00DE16 },
- { "America/Manaus" , 0x00DEC9 },
- { "America/Marigot" , 0x00DFCB },
- { "America/Martinique" , 0x00E020 },
- { "America/Matamoros" , 0x00E08C },
- { "America/Mazatlan" , 0x00E2E5 },
- { "America/Mendoza" , 0x00E552 },
- { "America/Menominee" , 0x00E706 },
- { "America/Merida" , 0x00EA87 },
- { "America/Metlakatla" , 0x00ECC2 },
- { "America/Mexico_City" , 0x00EDFC },
- { "America/Miquelon" , 0x00F077 },
- { "America/Moncton" , 0x00F2E9 },
- { "America/Monterrey" , 0x00F780 },
- { "America/Montevideo" , 0x00F9E3 },
- { "America/Montreal" , 0x00FCF5 },
- { "America/Montserrat" , 0x01020B },
- { "America/Nassau" , 0x010260 },
- { "America/New_York" , 0x0105A5 },
- { "America/Nipigon" , 0x010AB0 },
- { "America/Nome" , 0x010E01 },
- { "America/Noronha" , 0x01117F },
- { "America/North_Dakota/Beulah" , 0x0112AF },
- { "America/North_Dakota/Center" , 0x011643 },
- { "America/North_Dakota/New_Salem" , 0x0119D7 },
- { "America/Ojinaga" , 0x011D80 },
- { "America/Panama" , 0x011FE1 },
- { "America/Pangnirtung" , 0x012036 },
- { "America/Paramaribo" , 0x01236C },
- { "America/Phoenix" , 0x0123FE },
- { "America/Port-au-Prince" , 0x0124AC },
- { "America/Port_of_Spain" , 0x0126D1 },
- { "America/Porto_Acre" , 0x0125D2 },
- { "America/Porto_Velho" , 0x012726 },
- { "America/Puerto_Rico" , 0x01281C },
- { "America/Rainy_River" , 0x012887 },
- { "America/Rankin_Inlet" , 0x012BBF },
- { "America/Recife" , 0x012EA5 },
- { "America/Regina" , 0x012FCF },
- { "America/Resolute" , 0x01318D },
- { "America/Rio_Branco" , 0x01347E },
- { "America/Rosario" , 0x013581 },
- { "America/Santa_Isabel" , 0x013727 },
- { "America/Santarem" , 0x013ACA },
- { "America/Santiago" , 0x013BCF },
- { "America/Santo_Domingo" , 0x013F78 },
- { "America/Sao_Paulo" , 0x01403E },
- { "America/Scoresbysund" , 0x01434D },
- { "America/Shiprock" , 0x01463B },
- { "America/Sitka" , 0x0149CA },
- { "America/St_Barthelemy" , 0x014D52 },
- { "America/St_Johns" , 0x014DA7 },
- { "America/St_Kitts" , 0x0152FA },
- { "America/St_Lucia" , 0x01534F },
- { "America/St_Thomas" , 0x0153A4 },
- { "America/St_Vincent" , 0x0153F9 },
- { "America/Swift_Current" , 0x01544E },
- { "America/Tegucigalpa" , 0x01556F },
- { "America/Thule" , 0x0155EE },
- { "America/Thunder_Bay" , 0x015835 },
- { "America/Tijuana" , 0x015B7E },
- { "America/Toronto" , 0x015F17 },
- { "America/Tortola" , 0x01642E },
- { "America/Vancouver" , 0x016483 },
- { "America/Virgin" , 0x0168C0 },
- { "America/Whitehorse" , 0x016915 },
- { "America/Winnipeg" , 0x016C32 },
- { "America/Yakutat" , 0x017072 },
- { "America/Yellowknife" , 0x0173DD },
- { "Antarctica/Casey" , 0x0176ED },
- { "Antarctica/Davis" , 0x01778A },
- { "Antarctica/DumontDUrville" , 0x01782B },
- { "Antarctica/Macquarie" , 0x0178BD },
- { "Antarctica/Mawson" , 0x017B37 },
- { "Antarctica/McMurdo" , 0x017BB3 },
- { "Antarctica/Palmer" , 0x017EB5 },
- { "Antarctica/Rothera" , 0x0181D1 },
- { "Antarctica/South_Pole" , 0x018247 },
- { "Antarctica/Syowa" , 0x01854F },
- { "Antarctica/Vostok" , 0x0185BD },
- { "Arctic/Longyearbyen" , 0x01862E },
- { "Asia/Aden" , 0x018960 },
- { "Asia/Almaty" , 0x0189B5 },
- { "Asia/Amman" , 0x018B34 },
- { "Asia/Anadyr" , 0x018DF4 },
- { "Asia/Aqtau" , 0x018FD9 },
- { "Asia/Aqtobe" , 0x0191D8 },
- { "Asia/Ashgabat" , 0x019390 },
- { "Asia/Ashkhabad" , 0x0194AD },
- { "Asia/Baghdad" , 0x0195CA },
- { "Asia/Bahrain" , 0x01973F },
- { "Asia/Baku" , 0x0197A5 },
- { "Asia/Bangkok" , 0x019A8D },
- { "Asia/Beirut" , 0x019AE2 },
- { "Asia/Bishkek" , 0x019DEF },
- { "Asia/Brunei" , 0x019F9B },
- { "Asia/Calcutta" , 0x019FFD },
- { "Asia/Choibalsan" , 0x01A076 },
- { "Asia/Chongqing" , 0x01A1EF },
- { "Asia/Chungking" , 0x01A2DE },
- { "Asia/Colombo" , 0x01A38D },
- { "Asia/Dacca" , 0x01A429 },
- { "Asia/Damascus" , 0x01A4CF },
- { "Asia/Dhaka" , 0x01A81F },
- { "Asia/Dili" , 0x01A8C5 },
- { "Asia/Dubai" , 0x01A94E },
- { "Asia/Dushanbe" , 0x01A9A3 },
- { "Asia/Gaza" , 0x01AAA6 },
- { "Asia/Harbin" , 0x01ACFF },
- { "Asia/Hebron" , 0x01ADE6 },
- { "Asia/Ho_Chi_Minh" , 0x01B048 },
- { "Asia/Hong_Kong" , 0x01B0C0 },
- { "Asia/Hovd" , 0x01B282 },
- { "Asia/Irkutsk" , 0x01B3FA },
- { "Asia/Istanbul" , 0x01B5E0 },
- { "Asia/Jakarta" , 0x01B9CD },
- { "Asia/Jayapura" , 0x01BA77 },
- { "Asia/Jerusalem" , 0x01BB13 },
- { "Asia/Kabul" , 0x01BE42 },
- { "Asia/Kamchatka" , 0x01BE93 },
- { "Asia/Karachi" , 0x01C06F },
- { "Asia/Kashgar" , 0x01C124 },
- { "Asia/Kathmandu" , 0x01C1F5 },
- { "Asia/Katmandu" , 0x01C25B },
- { "Asia/Kolkata" , 0x01C2C1 },
- { "Asia/Krasnoyarsk" , 0x01C33A },
- { "Asia/Kuala_Lumpur" , 0x01C522 },
- { "Asia/Kuching" , 0x01C5DF },
- { "Asia/Kuwait" , 0x01C6CD },
- { "Asia/Macao" , 0x01C722 },
- { "Asia/Macau" , 0x01C85D },
- { "Asia/Magadan" , 0x01C998 },
- { "Asia/Makassar" , 0x01CB7A },
- { "Asia/Manila" , 0x01CC3E },
- { "Asia/Muscat" , 0x01CCC3 },
- { "Asia/Nicosia" , 0x01CD18 },
- { "Asia/Novokuznetsk" , 0x01D000 },
- { "Asia/Novosibirsk" , 0x01D202 },
- { "Asia/Omsk" , 0x01D3ED },
- { "Asia/Oral" , 0x01D5D4 },
- { "Asia/Phnom_Penh" , 0x01D7A4 },
- { "Asia/Pontianak" , 0x01D81C },
- { "Asia/Pyongyang" , 0x01D8DD },
- { "Asia/Qatar" , 0x01D94A },
- { "Asia/Qyzylorda" , 0x01D9B0 },
- { "Asia/Rangoon" , 0x01DB86 },
- { "Asia/Riyadh" , 0x01DBFE },
- { "Asia/Saigon" , 0x01DC53 },
- { "Asia/Sakhalin" , 0x01DCCB },
- { "Asia/Samarkand" , 0x01DEC2 },
- { "Asia/Seoul" , 0x01DFF8 },
- { "Asia/Shanghai" , 0x01E09C },
- { "Asia/Singapore" , 0x01E17C },
- { "Asia/Taipei" , 0x01E233 },
- { "Asia/Tashkent" , 0x01E34B },
- { "Asia/Tbilisi" , 0x01E47C },
- { "Asia/Tehran" , 0x01E636 },
- { "Asia/Tel_Aviv" , 0x01E8A4 },
- { "Asia/Thimbu" , 0x01EBD3 },
- { "Asia/Thimphu" , 0x01EC39 },
- { "Asia/Tokyo" , 0x01EC9F },
- { "Asia/Ujung_Pandang" , 0x01ED28 },
- { "Asia/Ulaanbaatar" , 0x01EDA4 },
- { "Asia/Ulan_Bator" , 0x01EEFF },
- { "Asia/Urumqi" , 0x01F04C },
- { "Asia/Vientiane" , 0x01F113 },
- { "Asia/Vladivostok" , 0x01F18B },
- { "Asia/Yakutsk" , 0x01F377 },
- { "Asia/Yekaterinburg" , 0x01F55C },
- { "Asia/Yerevan" , 0x01F767 },
- { "Atlantic/Azores" , 0x01F967 },
- { "Atlantic/Bermuda" , 0x01FE6A },
- { "Atlantic/Canary" , 0x02014B },
- { "Atlantic/Cape_Verde" , 0x020421 },
- { "Atlantic/Faeroe" , 0x02049A },
- { "Atlantic/Faroe" , 0x02073E },
- { "Atlantic/Jan_Mayen" , 0x0209E2 },
- { "Atlantic/Madeira" , 0x020D14 },
- { "Atlantic/Reykjavik" , 0x02121D },
- { "Atlantic/South_Georgia" , 0x0213D6 },
- { "Atlantic/St_Helena" , 0x0215E8 },
- { "Atlantic/Stanley" , 0x02141A },
- { "Australia/ACT" , 0x02163D },
- { "Australia/Adelaide" , 0x02195A },
- { "Australia/Brisbane" , 0x021C86 },
- { "Australia/Broken_Hill" , 0x021D4D },
- { "Australia/Canberra" , 0x02208B },
- { "Australia/Currie" , 0x0223A8 },
- { "Australia/Darwin" , 0x0226DB },
- { "Australia/Eucla" , 0x022761 },
- { "Australia/Hobart" , 0x022836 },
- { "Australia/LHI" , 0x022B94 },
- { "Australia/Lindeman" , 0x022E2F },
- { "Australia/Lord_Howe" , 0x022F10 },
- { "Australia/Melbourne" , 0x0231BB },
- { "Australia/North" , 0x0234E0 },
- { "Australia/NSW" , 0x023554 },
- { "Australia/Perth" , 0x023871 },
- { "Australia/Queensland" , 0x023949 },
- { "Australia/South" , 0x0239F5 },
- { "Australia/Sydney" , 0x023D12 },
- { "Australia/Tasmania" , 0x02404F },
- { "Australia/Victoria" , 0x024394 },
- { "Australia/West" , 0x0246B1 },
- { "Australia/Yancowinna" , 0x024767 },
- { "Brazil/Acre" , 0x024A89 },
- { "Brazil/DeNoronha" , 0x024B88 },
- { "Brazil/East" , 0x024CA8 },
- { "Brazil/West" , 0x024F85 },
- { "Canada/Atlantic" , 0x02507D },
- { "Canada/Central" , 0x025565 },
- { "Canada/East-Saskatchewan" , 0x025E6F },
- { "Canada/Eastern" , 0x02597F },
- { "Canada/Mountain" , 0x025FF8 },
- { "Canada/Newfoundland" , 0x02636E },
- { "Canada/Pacific" , 0x026899 },
- { "Canada/Saskatchewan" , 0x026CB2 },
- { "Canada/Yukon" , 0x026E3B },
- { "CET" , 0x02713E },
- { "Chile/Continental" , 0x027447 },
- { "Chile/EasterIsland" , 0x0277E2 },
- { "CST6CDT" , 0x027B24 },
- { "Cuba" , 0x027E75 },
- { "EET" , 0x0281E8 },
- { "Egypt" , 0x02849B },
- { "Eire" , 0x02875E },
- { "EST" , 0x028C6F },
- { "EST5EDT" , 0x028CB3 },
- { "Etc/GMT" , 0x029004 },
- { "Etc/GMT+0" , 0x0290D0 },
- { "Etc/GMT+1" , 0x02915A },
- { "Etc/GMT+10" , 0x0291E7 },
- { "Etc/GMT+11" , 0x029275 },
- { "Etc/GMT+12" , 0x029303 },
- { "Etc/GMT+2" , 0x02941E },
- { "Etc/GMT+3" , 0x0294AA },
- { "Etc/GMT+4" , 0x029536 },
- { "Etc/GMT+5" , 0x0295C2 },
- { "Etc/GMT+6" , 0x02964E },
- { "Etc/GMT+7" , 0x0296DA },
- { "Etc/GMT+8" , 0x029766 },
- { "Etc/GMT+9" , 0x0297F2 },
- { "Etc/GMT-0" , 0x02908C },
- { "Etc/GMT-1" , 0x029114 },
- { "Etc/GMT-10" , 0x0291A0 },
- { "Etc/GMT-11" , 0x02922E },
- { "Etc/GMT-12" , 0x0292BC },
- { "Etc/GMT-13" , 0x02934A },
- { "Etc/GMT-14" , 0x029391 },
- { "Etc/GMT-2" , 0x0293D8 },
- { "Etc/GMT-3" , 0x029464 },
- { "Etc/GMT-4" , 0x0294F0 },
- { "Etc/GMT-5" , 0x02957C },
- { "Etc/GMT-6" , 0x029608 },
- { "Etc/GMT-7" , 0x029694 },
- { "Etc/GMT-8" , 0x029720 },
- { "Etc/GMT-9" , 0x0297AC },
- { "Etc/GMT0" , 0x029048 },
- { "Etc/Greenwich" , 0x029838 },
- { "Etc/UCT" , 0x02987C },
- { "Etc/Universal" , 0x0298C0 },
- { "Etc/UTC" , 0x029904 },
- { "Etc/Zulu" , 0x029948 },
- { "Europe/Amsterdam" , 0x02998C },
- { "Europe/Andorra" , 0x029DCA },
- { "Europe/Athens" , 0x02A046 },
- { "Europe/Belfast" , 0x02A389 },
- { "Europe/Belgrade" , 0x02A8C0 },
- { "Europe/Berlin" , 0x02AB89 },
- { "Europe/Bratislava" , 0x02AEDF },
- { "Europe/Brussels" , 0x02B211 },
- { "Europe/Bucharest" , 0x02B648 },
- { "Europe/Budapest" , 0x02B972 },
- { "Europe/Chisinau" , 0x02BCE5 },
- { "Europe/Copenhagen" , 0x02C073 },
- { "Europe/Dublin" , 0x02C37D },
- { "Europe/Gibraltar" , 0x02C88E },
- { "Europe/Guernsey" , 0x02CCE5 },
- { "Europe/Helsinki" , 0x02D21C },
- { "Europe/Isle_of_Man" , 0x02D4D2 },
- { "Europe/Istanbul" , 0x02DA09 },
- { "Europe/Jersey" , 0x02DDF6 },
- { "Europe/Kaliningrad" , 0x02E32D },
- { "Europe/Kiev" , 0x02E593 },
- { "Europe/Lisbon" , 0x02E8AA },
- { "Europe/Ljubljana" , 0x02EDAE },
- { "Europe/London" , 0x02F077 },
- { "Europe/Luxembourg" , 0x02F5AE },
- { "Europe/Madrid" , 0x02FA04 },
- { "Europe/Malta" , 0x02FDCA },
- { "Europe/Mariehamn" , 0x030183 },
- { "Europe/Minsk" , 0x030439 },
- { "Europe/Monaco" , 0x030647 },
- { "Europe/Moscow" , 0x030A82 },
- { "Europe/Nicosia" , 0x030CD3 },
- { "Europe/Oslo" , 0x030FBB },
- { "Europe/Paris" , 0x0312ED },
- { "Europe/Podgorica" , 0x031733 },
- { "Europe/Prague" , 0x0319FC },
- { "Europe/Riga" , 0x031D2E },
- { "Europe/Rome" , 0x032073 },
- { "Europe/Samara" , 0x032436 },
- { "Europe/San_Marino" , 0x032669 },
- { "Europe/Sarajevo" , 0x032A2C },
- { "Europe/Simferopol" , 0x032CF5 },
- { "Europe/Skopje" , 0x033020 },
- { "Europe/Sofia" , 0x0332E9 },
- { "Europe/Stockholm" , 0x0335F1 },
- { "Europe/Tallinn" , 0x0338A0 },
- { "Europe/Tirane" , 0x033BDA },
- { "Europe/Tiraspol" , 0x033EE0 },
- { "Europe/Uzhgorod" , 0x03426E },
- { "Europe/Vaduz" , 0x034585 },
- { "Europe/Vatican" , 0x034818 },
- { "Europe/Vienna" , 0x034BDB },
- { "Europe/Vilnius" , 0x034F08 },
- { "Europe/Volgograd" , 0x035247 },
- { "Europe/Warsaw" , 0x035447 },
- { "Europe/Zagreb" , 0x035828 },
- { "Europe/Zaporozhye" , 0x035AF1 },
- { "Europe/Zurich" , 0x035E32 },
- { "Factory" , 0x0360E1 },
- { "GB" , 0x036152 },
- { "GB-Eire" , 0x036689 },
- { "GMT" , 0x036BC0 },
- { "GMT+0" , 0x036C8C },
- { "GMT-0" , 0x036C48 },
- { "GMT0" , 0x036C04 },
- { "Greenwich" , 0x036CD0 },
- { "Hongkong" , 0x036D14 },
- { "HST" , 0x036ED6 },
- { "Iceland" , 0x036F1A },
- { "Indian/Antananarivo" , 0x0370D3 },
- { "Indian/Chagos" , 0x037147 },
- { "Indian/Christmas" , 0x0371A9 },
- { "Indian/Cocos" , 0x0371ED },
- { "Indian/Comoro" , 0x037231 },
- { "Indian/Kerguelen" , 0x037286 },
- { "Indian/Mahe" , 0x0372DB },
- { "Indian/Maldives" , 0x037330 },
- { "Indian/Mauritius" , 0x037385 },
- { "Indian/Mayotte" , 0x0373FB },
- { "Indian/Reunion" , 0x037450 },
- { "Iran" , 0x0374A5 },
- { "Israel" , 0x037713 },
- { "Jamaica" , 0x037A42 },
- { "Japan" , 0x037B07 },
- { "Kwajalein" , 0x037B90 },
- { "Libya" , 0x037BF3 },
- { "MET" , 0x037CED },
- { "Mexico/BajaNorte" , 0x037FF6 },
- { "Mexico/BajaSur" , 0x03835F },
- { "Mexico/General" , 0x0385A4 },
- { "MST" , 0x038802 },
- { "MST7MDT" , 0x038846 },
- { "Navajo" , 0x038B97 },
- { "NZ" , 0x038F10 },
- { "NZ-CHAT" , 0x03928E },
- { "Pacific/Apia" , 0x039576 },
- { "Pacific/Auckland" , 0x039613 },
- { "Pacific/Chatham" , 0x03999F },
- { "Pacific/Chuuk" , 0x039C96 },
- { "Pacific/Easter" , 0x039CEF },
- { "Pacific/Efate" , 0x03A04D },
- { "Pacific/Enderbury" , 0x03A113 },
- { "Pacific/Fakaofo" , 0x03A181 },
- { "Pacific/Fiji" , 0x03A1D2 },
- { "Pacific/Funafuti" , 0x03A266 },
- { "Pacific/Galapagos" , 0x03A2AA },
- { "Pacific/Gambier" , 0x03A322 },
- { "Pacific/Guadalcanal" , 0x03A387 },
- { "Pacific/Guam" , 0x03A3DC },
- { "Pacific/Honolulu" , 0x03A432 },
- { "Pacific/Johnston" , 0x03A4A9 },
- { "Pacific/Kiritimati" , 0x03A4FB },
- { "Pacific/Kosrae" , 0x03A566 },
- { "Pacific/Kwajalein" , 0x03A5C3 },
- { "Pacific/Majuro" , 0x03A62F },
- { "Pacific/Marquesas" , 0x03A68E },
- { "Pacific/Midway" , 0x03A6F5 },
- { "Pacific/Nauru" , 0x03A77F },
- { "Pacific/Niue" , 0x03A7F7 },
- { "Pacific/Norfolk" , 0x03A855 },
- { "Pacific/Noumea" , 0x03A8AA },
- { "Pacific/Pago_Pago" , 0x03A93A },
- { "Pacific/Palau" , 0x03A9C3 },
- { "Pacific/Pitcairn" , 0x03AA07 },
- { "Pacific/Pohnpei" , 0x03AA5C },
- { "Pacific/Ponape" , 0x03AAB1 },
- { "Pacific/Port_Moresby" , 0x03AAF6 },
- { "Pacific/Rarotonga" , 0x03AB3A },
- { "Pacific/Saipan" , 0x03AC16 },
- { "Pacific/Samoa" , 0x03AC79 },
- { "Pacific/Tahiti" , 0x03AD02 },
- { "Pacific/Tarawa" , 0x03AD67 },
- { "Pacific/Tongatapu" , 0x03ADBB },
- { "Pacific/Truk" , 0x03AE47 },
- { "Pacific/Wake" , 0x03AE8C },
- { "Pacific/Wallis" , 0x03AEDC },
- { "Pacific/Yap" , 0x03AF20 },
- { "Poland" , 0x03AF65 },
- { "Portugal" , 0x03B346 },
- { "PRC" , 0x03B842 },
- { "PST8PDT" , 0x03B8F3 },
- { "ROC" , 0x03BC44 },
- { "ROK" , 0x03BD5C },
- { "Singapore" , 0x03BE00 },
- { "Turkey" , 0x03BEB7 },
- { "UCT" , 0x03C2A4 },
- { "Universal" , 0x03C2E8 },
- { "US/Alaska" , 0x03C32C },
- { "US/Aleutian" , 0x03C695 },
- { "US/Arizona" , 0x03C9FB },
- { "US/Central" , 0x03CA89 },
- { "US/East-Indiana" , 0x03D493 },
- { "US/Eastern" , 0x03CF94 },
- { "US/Hawaii" , 0x03D6FD },
- { "US/Indiana-Starke" , 0x03D76E },
- { "US/Michigan" , 0x03DADF },
- { "US/Mountain" , 0x03DE16 },
- { "US/Pacific" , 0x03E18F },
- { "US/Pacific-New" , 0x03E594 },
- { "US/Samoa" , 0x03E999 },
- { "UTC" , 0x03EA22 },
- { "W-SU" , 0x03ED19 },
- { "WET" , 0x03EA66 },
- { "Zulu" , 0x03EF53 },
+ { "Africa/Ceuta" , 0x000A76 },
+ { "Africa/Conakry" , 0x000D7D },
+ { "Africa/Dakar" , 0x000DE8 },
+ { "Africa/Dar_es_Salaam" , 0x000E4E },
+ { "Africa/Djibouti" , 0x000EBB },
+ { "Africa/Douala" , 0x000F10 },
+ { "Africa/El_Aaiun" , 0x000F65 },
+ { "Africa/Freetown" , 0x000FCB },
+ { "Africa/Gaborone" , 0x0010DA },
+ { "Africa/Harare" , 0x001135 },
+ { "Africa/Johannesburg" , 0x00118A },
+ { "Africa/Juba" , 0x0011F8 },
+ { "Africa/Kampala" , 0x00130B },
+ { "Africa/Khartoum" , 0x00138A },
+ { "Africa/Kigali" , 0x00149D },
+ { "Africa/Kinshasa" , 0x0014F2 },
+ { "Africa/Lagos" , 0x00154D },
+ { "Africa/Libreville" , 0x0015A2 },
+ { "Africa/Lome" , 0x0015F7 },
+ { "Africa/Luanda" , 0x00163B },
+ { "Africa/Lubumbashi" , 0x001690 },
+ { "Africa/Lusaka" , 0x0016EB },
+ { "Africa/Malabo" , 0x001740 },
+ { "Africa/Maputo" , 0x0017A6 },
+ { "Africa/Maseru" , 0x0017FB },
+ { "Africa/Mbabane" , 0x001863 },
+ { "Africa/Mogadishu" , 0x0018B9 },
+ { "Africa/Monrovia" , 0x001914 },
+ { "Africa/Nairobi" , 0x00197A },
+ { "Africa/Ndjamena" , 0x0019F9 },
+ { "Africa/Niamey" , 0x001A65 },
+ { "Africa/Nouakchott" , 0x001AD8 },
+ { "Africa/Ouagadougou" , 0x001B43 },
+ { "Africa/Porto-Novo" , 0x001B98 },
+ { "Africa/Sao_Tome" , 0x001BFE },
+ { "Africa/Timbuktu" , 0x001C53 },
+ { "Africa/Tripoli" , 0x001CBE },
+ { "Africa/Tunis" , 0x001DB8 },
+ { "Africa/Windhoek" , 0x001ECA },
+ { "America/Adak" , 0x002111 },
+ { "America/Anchorage" , 0x002487 },
+ { "America/Anguilla" , 0x0027FB },
+ { "America/Antigua" , 0x002850 },
+ { "America/Araguaina" , 0x0028B6 },
+ { "America/Argentina/Buenos_Aires" , 0x002A11 },
+ { "America/Argentina/Catamarca" , 0x002BBF },
+ { "America/Argentina/ComodRivadavia" , 0x002D80 },
+ { "America/Argentina/Cordoba" , 0x002F26 },
+ { "America/Argentina/Jujuy" , 0x0030FB },
+ { "America/Argentina/La_Rioja" , 0x0032AF },
+ { "America/Argentina/Mendoza" , 0x003467 },
+ { "America/Argentina/Rio_Gallegos" , 0x003627 },
+ { "America/Argentina/Salta" , 0x0037DC },
+ { "America/Argentina/San_Juan" , 0x003988 },
+ { "America/Argentina/San_Luis" , 0x003B40 },
+ { "America/Argentina/Tucuman" , 0x003D06 },
+ { "America/Argentina/Ushuaia" , 0x003EC2 },
+ { "America/Aruba" , 0x00407D },
+ { "America/Asuncion" , 0x0040E3 },
+ { "America/Atikokan" , 0x0043C8 },
+ { "America/Atka" , 0x00449E },
+ { "America/Bahia" , 0x004804 },
+ { "America/Bahia_Banderas" , 0x004A96 },
+ { "America/Barbados" , 0x004D0F },
+ { "America/Belem" , 0x004DA9 },
+ { "America/Belize" , 0x004EA4 },
+ { "America/Blanc-Sablon" , 0x005020 },
+ { "America/Boa_Vista" , 0x0050D4 },
+ { "America/Bogota" , 0x0051DD },
+ { "America/Boise" , 0x005249 },
+ { "America/Buenos_Aires" , 0x0055E0 },
+ { "America/Cambridge_Bay" , 0x005779 },
+ { "America/Campo_Grande" , 0x005AA1 },
+ { "America/Cancun" , 0x005D90 },
+ { "America/Caracas" , 0x005FD2 },
+ { "America/Catamarca" , 0x006039 },
+ { "America/Cayenne" , 0x0061DF },
+ { "America/Cayman" , 0x006241 },
+ { "America/Chicago" , 0x006296 },
+ { "America/Chihuahua" , 0x0067AD },
+ { "America/Coral_Harbour" , 0x006A18 },
+ { "America/Cordoba" , 0x006AAA },
+ { "America/Costa_Rica" , 0x006C50 },
+ { "America/Creston" , 0x006CDA },
+ { "America/Cuiaba" , 0x006D66 },
+ { "America/Curacao" , 0x007044 },
+ { "America/Danmarkshavn" , 0x0070AA },
+ { "America/Dawson" , 0x0071EE },
+ { "America/Dawson_Creek" , 0x00750B },
+ { "America/Denver" , 0x0076E5 },
+ { "America/Detroit" , 0x007A6B },
+ { "America/Dominica" , 0x007DCA },
+ { "America/Edmonton" , 0x007E1F },
+ { "America/Eirunepe" , 0x0081D7 },
+ { "America/El_Salvador" , 0x0082EA },
+ { "America/Ensenada" , 0x00835F },
+ { "America/Fort_Wayne" , 0x008806 },
+ { "America/Fortaleza" , 0x0086C8 },
+ { "America/Glace_Bay" , 0x008A70 },
+ { "America/Godthab" , 0x008DE7 },
+ { "America/Goose_Bay" , 0x0090AB },
+ { "America/Grand_Turk" , 0x009568 },
+ { "America/Grenada" , 0x009817 },
+ { "America/Guadeloupe" , 0x00986C },
+ { "America/Guatemala" , 0x0098C1 },
+ { "America/Guayaquil" , 0x00994A },
+ { "America/Guyana" , 0x0099A7 },
+ { "America/Halifax" , 0x009A28 },
+ { "America/Havana" , 0x009F3E },
+ { "America/Hermosillo" , 0x00A2B1 },
+ { "America/Indiana/Indianapolis" , 0x00A38F },
+ { "America/Indiana/Knox" , 0x00A620 },
+ { "America/Indiana/Marengo" , 0x00A9B7 },
+ { "America/Indiana/Petersburg" , 0x00AC5D },
+ { "America/Indiana/Tell_City" , 0x00B1AA },
+ { "America/Indiana/Vevay" , 0x00B443 },
+ { "America/Indiana/Vincennes" , 0x00B67E },
+ { "America/Indiana/Winamac" , 0x00B932 },
+ { "America/Indianapolis" , 0x00AF40 },
+ { "America/Inuvik" , 0x00BBEB },
+ { "America/Iqaluit" , 0x00BEE2 },
+ { "America/Jamaica" , 0x00C204 },
+ { "America/Jujuy" , 0x00C2C9 },
+ { "America/Juneau" , 0x00C473 },
+ { "America/Kentucky/Louisville" , 0x00C7F1 },
+ { "America/Kentucky/Monticello" , 0x00CC0F },
+ { "America/Knox_IN" , 0x00CF94 },
+ { "America/Kralendijk" , 0x00D305 },
+ { "America/La_Paz" , 0x00D36B },
+ { "America/Lima" , 0x00D3D2 },
+ { "America/Los_Angeles" , 0x00D47A },
+ { "America/Louisville" , 0x00D88B },
+ { "America/Lower_Princes" , 0x00DC80 },
+ { "America/Maceio" , 0x00DCE6 },
+ { "America/Managua" , 0x00DE20 },
+ { "America/Manaus" , 0x00DED3 },
+ { "America/Marigot" , 0x00DFD5 },
+ { "America/Martinique" , 0x00E02A },
+ { "America/Matamoros" , 0x00E096 },
+ { "America/Mazatlan" , 0x00E2EF },
+ { "America/Mendoza" , 0x00E55C },
+ { "America/Menominee" , 0x00E710 },
+ { "America/Merida" , 0x00EA91 },
+ { "America/Metlakatla" , 0x00ECCC },
+ { "America/Mexico_City" , 0x00EE06 },
+ { "America/Miquelon" , 0x00F081 },
+ { "America/Moncton" , 0x00F2F3 },
+ { "America/Monterrey" , 0x00F78A },
+ { "America/Montevideo" , 0x00F9ED },
+ { "America/Montreal" , 0x00FCFF },
+ { "America/Montserrat" , 0x010215 },
+ { "America/Nassau" , 0x01026A },
+ { "America/New_York" , 0x0105AF },
+ { "America/Nipigon" , 0x010ABA },
+ { "America/Nome" , 0x010E0B },
+ { "America/Noronha" , 0x011189 },
+ { "America/North_Dakota/Beulah" , 0x0112B9 },
+ { "America/North_Dakota/Center" , 0x01164D },
+ { "America/North_Dakota/New_Salem" , 0x0119E1 },
+ { "America/Ojinaga" , 0x011D8A },
+ { "America/Panama" , 0x011FEB },
+ { "America/Pangnirtung" , 0x012040 },
+ { "America/Paramaribo" , 0x012376 },
+ { "America/Phoenix" , 0x012408 },
+ { "America/Port-au-Prince" , 0x0124B6 },
+ { "America/Port_of_Spain" , 0x0126DB },
+ { "America/Porto_Acre" , 0x0125DC },
+ { "America/Porto_Velho" , 0x012730 },
+ { "America/Puerto_Rico" , 0x012826 },
+ { "America/Rainy_River" , 0x012891 },
+ { "America/Rankin_Inlet" , 0x012BC9 },
+ { "America/Recife" , 0x012EAF },
+ { "America/Regina" , 0x012FD9 },
+ { "America/Resolute" , 0x013197 },
+ { "America/Rio_Branco" , 0x013488 },
+ { "America/Rosario" , 0x01358B },
+ { "America/Santa_Isabel" , 0x013731 },
+ { "America/Santarem" , 0x013AD4 },
+ { "America/Santiago" , 0x013BD9 },
+ { "America/Santo_Domingo" , 0x013F82 },
+ { "America/Sao_Paulo" , 0x014048 },
+ { "America/Scoresbysund" , 0x014357 },
+ { "America/Shiprock" , 0x014645 },
+ { "America/Sitka" , 0x0149D4 },
+ { "America/St_Barthelemy" , 0x014D5C },
+ { "America/St_Johns" , 0x014DB1 },
+ { "America/St_Kitts" , 0x015304 },
+ { "America/St_Lucia" , 0x015359 },
+ { "America/St_Thomas" , 0x0153AE },
+ { "America/St_Vincent" , 0x015403 },
+ { "America/Swift_Current" , 0x015458 },
+ { "America/Tegucigalpa" , 0x015579 },
+ { "America/Thule" , 0x0155F8 },
+ { "America/Thunder_Bay" , 0x01583F },
+ { "America/Tijuana" , 0x015B88 },
+ { "America/Toronto" , 0x015F21 },
+ { "America/Tortola" , 0x016438 },
+ { "America/Vancouver" , 0x01648D },
+ { "America/Virgin" , 0x0168CA },
+ { "America/Whitehorse" , 0x01691F },
+ { "America/Winnipeg" , 0x016C3C },
+ { "America/Yakutat" , 0x01707C },
+ { "America/Yellowknife" , 0x0173E7 },
+ { "Antarctica/Casey" , 0x0176F7 },
+ { "Antarctica/Davis" , 0x017794 },
+ { "Antarctica/DumontDUrville" , 0x017835 },
+ { "Antarctica/Macquarie" , 0x0178C7 },
+ { "Antarctica/Mawson" , 0x017B41 },
+ { "Antarctica/McMurdo" , 0x017BBD },
+ { "Antarctica/Palmer" , 0x017EBF },
+ { "Antarctica/Rothera" , 0x0181DB },
+ { "Antarctica/South_Pole" , 0x018251 },
+ { "Antarctica/Syowa" , 0x018559 },
+ { "Antarctica/Vostok" , 0x0185C7 },
+ { "Arctic/Longyearbyen" , 0x018638 },
+ { "Asia/Aden" , 0x01896A },
+ { "Asia/Almaty" , 0x0189BF },
+ { "Asia/Amman" , 0x018B3E },
+ { "Asia/Anadyr" , 0x018DFE },
+ { "Asia/Aqtau" , 0x018FE3 },
+ { "Asia/Aqtobe" , 0x0191E2 },
+ { "Asia/Ashgabat" , 0x01939A },
+ { "Asia/Ashkhabad" , 0x0194B7 },
+ { "Asia/Baghdad" , 0x0195D4 },
+ { "Asia/Bahrain" , 0x019749 },
+ { "Asia/Baku" , 0x0197AF },
+ { "Asia/Bangkok" , 0x019A97 },
+ { "Asia/Beirut" , 0x019AEC },
+ { "Asia/Bishkek" , 0x019DF9 },
+ { "Asia/Brunei" , 0x019FA5 },
+ { "Asia/Calcutta" , 0x01A007 },
+ { "Asia/Choibalsan" , 0x01A080 },
+ { "Asia/Chongqing" , 0x01A1F9 },
+ { "Asia/Chungking" , 0x01A2E8 },
+ { "Asia/Colombo" , 0x01A397 },
+ { "Asia/Dacca" , 0x01A433 },
+ { "Asia/Damascus" , 0x01A4D9 },
+ { "Asia/Dhaka" , 0x01A829 },
+ { "Asia/Dili" , 0x01A8CF },
+ { "Asia/Dubai" , 0x01A958 },
+ { "Asia/Dushanbe" , 0x01A9AD },
+ { "Asia/Gaza" , 0x01AAB0 },
+ { "Asia/Harbin" , 0x01AD09 },
+ { "Asia/Hebron" , 0x01ADF0 },
+ { "Asia/Ho_Chi_Minh" , 0x01B052 },
+ { "Asia/Hong_Kong" , 0x01B0CA },
+ { "Asia/Hovd" , 0x01B28C },
+ { "Asia/Irkutsk" , 0x01B404 },
+ { "Asia/Istanbul" , 0x01B5EA },
+ { "Asia/Jakarta" , 0x01B9D7 },
+ { "Asia/Jayapura" , 0x01BA81 },
+ { "Asia/Jerusalem" , 0x01BB1D },
+ { "Asia/Kabul" , 0x01BE4C },
+ { "Asia/Kamchatka" , 0x01BE9D },
+ { "Asia/Karachi" , 0x01C079 },
+ { "Asia/Kashgar" , 0x01C12E },
+ { "Asia/Kathmandu" , 0x01C1FF },
+ { "Asia/Katmandu" , 0x01C265 },
+ { "Asia/Kolkata" , 0x01C2CB },
+ { "Asia/Krasnoyarsk" , 0x01C344 },
+ { "Asia/Kuala_Lumpur" , 0x01C52C },
+ { "Asia/Kuching" , 0x01C5E9 },
+ { "Asia/Kuwait" , 0x01C6D7 },
+ { "Asia/Macao" , 0x01C72C },
+ { "Asia/Macau" , 0x01C867 },
+ { "Asia/Magadan" , 0x01C9A2 },
+ { "Asia/Makassar" , 0x01CB84 },
+ { "Asia/Manila" , 0x01CC48 },
+ { "Asia/Muscat" , 0x01CCCD },
+ { "Asia/Nicosia" , 0x01CD22 },
+ { "Asia/Novokuznetsk" , 0x01D00A },
+ { "Asia/Novosibirsk" , 0x01D20C },
+ { "Asia/Omsk" , 0x01D3F7 },
+ { "Asia/Oral" , 0x01D5DE },
+ { "Asia/Phnom_Penh" , 0x01D7AE },
+ { "Asia/Pontianak" , 0x01D826 },
+ { "Asia/Pyongyang" , 0x01D8E7 },
+ { "Asia/Qatar" , 0x01D954 },
+ { "Asia/Qyzylorda" , 0x01D9BA },
+ { "Asia/Rangoon" , 0x01DB90 },
+ { "Asia/Riyadh" , 0x01DC08 },
+ { "Asia/Saigon" , 0x01DC5D },
+ { "Asia/Sakhalin" , 0x01DCD5 },
+ { "Asia/Samarkand" , 0x01DECC },
+ { "Asia/Seoul" , 0x01E002 },
+ { "Asia/Shanghai" , 0x01E0A6 },
+ { "Asia/Singapore" , 0x01E186 },
+ { "Asia/Taipei" , 0x01E23D },
+ { "Asia/Tashkent" , 0x01E355 },
+ { "Asia/Tbilisi" , 0x01E486 },
+ { "Asia/Tehran" , 0x01E640 },
+ { "Asia/Tel_Aviv" , 0x01E8AE },
+ { "Asia/Thimbu" , 0x01EBDD },
+ { "Asia/Thimphu" , 0x01EC43 },
+ { "Asia/Tokyo" , 0x01ECA9 },
+ { "Asia/Ujung_Pandang" , 0x01ED32 },
+ { "Asia/Ulaanbaatar" , 0x01EDAE },
+ { "Asia/Ulan_Bator" , 0x01EF09 },
+ { "Asia/Urumqi" , 0x01F056 },
+ { "Asia/Vientiane" , 0x01F11D },
+ { "Asia/Vladivostok" , 0x01F195 },
+ { "Asia/Yakutsk" , 0x01F381 },
+ { "Asia/Yekaterinburg" , 0x01F566 },
+ { "Asia/Yerevan" , 0x01F771 },
+ { "Atlantic/Azores" , 0x01F971 },
+ { "Atlantic/Bermuda" , 0x01FE74 },
+ { "Atlantic/Canary" , 0x020155 },
+ { "Atlantic/Cape_Verde" , 0x02042B },
+ { "Atlantic/Faeroe" , 0x0204A4 },
+ { "Atlantic/Faroe" , 0x020748 },
+ { "Atlantic/Jan_Mayen" , 0x0209EC },
+ { "Atlantic/Madeira" , 0x020D1E },
+ { "Atlantic/Reykjavik" , 0x021227 },
+ { "Atlantic/South_Georgia" , 0x0213E0 },
+ { "Atlantic/St_Helena" , 0x0215F2 },
+ { "Atlantic/Stanley" , 0x021424 },
+ { "Australia/ACT" , 0x021647 },
+ { "Australia/Adelaide" , 0x021964 },
+ { "Australia/Brisbane" , 0x021C90 },
+ { "Australia/Broken_Hill" , 0x021D57 },
+ { "Australia/Canberra" , 0x022095 },
+ { "Australia/Currie" , 0x0223B2 },
+ { "Australia/Darwin" , 0x0226E5 },
+ { "Australia/Eucla" , 0x02276B },
+ { "Australia/Hobart" , 0x022840 },
+ { "Australia/LHI" , 0x022B9E },
+ { "Australia/Lindeman" , 0x022E39 },
+ { "Australia/Lord_Howe" , 0x022F1A },
+ { "Australia/Melbourne" , 0x0231C5 },
+ { "Australia/North" , 0x0234EA },
+ { "Australia/NSW" , 0x02355E },
+ { "Australia/Perth" , 0x02387B },
+ { "Australia/Queensland" , 0x023953 },
+ { "Australia/South" , 0x0239FF },
+ { "Australia/Sydney" , 0x023D1C },
+ { "Australia/Tasmania" , 0x024059 },
+ { "Australia/Victoria" , 0x02439E },
+ { "Australia/West" , 0x0246BB },
+ { "Australia/Yancowinna" , 0x024771 },
+ { "Brazil/Acre" , 0x024A93 },
+ { "Brazil/DeNoronha" , 0x024B92 },
+ { "Brazil/East" , 0x024CB2 },
+ { "Brazil/West" , 0x024F8F },
+ { "Canada/Atlantic" , 0x025087 },
+ { "Canada/Central" , 0x02556F },
+ { "Canada/East-Saskatchewan" , 0x025E79 },
+ { "Canada/Eastern" , 0x025989 },
+ { "Canada/Mountain" , 0x026002 },
+ { "Canada/Newfoundland" , 0x026378 },
+ { "Canada/Pacific" , 0x0268A3 },
+ { "Canada/Saskatchewan" , 0x026CBC },
+ { "Canada/Yukon" , 0x026E45 },
+ { "CET" , 0x027148 },
+ { "Chile/Continental" , 0x027451 },
+ { "Chile/EasterIsland" , 0x0277EC },
+ { "CST6CDT" , 0x027B2E },
+ { "Cuba" , 0x027E7F },
+ { "EET" , 0x0281F2 },
+ { "Egypt" , 0x0284A5 },
+ { "Eire" , 0x028768 },
+ { "EST" , 0x028C79 },
+ { "EST5EDT" , 0x028CBD },
+ { "Etc/GMT" , 0x02900E },
+ { "Etc/GMT+0" , 0x0290DA },
+ { "Etc/GMT+1" , 0x029164 },
+ { "Etc/GMT+10" , 0x0291F1 },
+ { "Etc/GMT+11" , 0x02927F },
+ { "Etc/GMT+12" , 0x02930D },
+ { "Etc/GMT+2" , 0x029428 },
+ { "Etc/GMT+3" , 0x0294B4 },
+ { "Etc/GMT+4" , 0x029540 },
+ { "Etc/GMT+5" , 0x0295CC },
+ { "Etc/GMT+6" , 0x029658 },
+ { "Etc/GMT+7" , 0x0296E4 },
+ { "Etc/GMT+8" , 0x029770 },
+ { "Etc/GMT+9" , 0x0297FC },
+ { "Etc/GMT-0" , 0x029096 },
+ { "Etc/GMT-1" , 0x02911E },
+ { "Etc/GMT-10" , 0x0291AA },
+ { "Etc/GMT-11" , 0x029238 },
+ { "Etc/GMT-12" , 0x0292C6 },
+ { "Etc/GMT-13" , 0x029354 },
+ { "Etc/GMT-14" , 0x02939B },
+ { "Etc/GMT-2" , 0x0293E2 },
+ { "Etc/GMT-3" , 0x02946E },
+ { "Etc/GMT-4" , 0x0294FA },
+ { "Etc/GMT-5" , 0x029586 },
+ { "Etc/GMT-6" , 0x029612 },
+ { "Etc/GMT-7" , 0x02969E },
+ { "Etc/GMT-8" , 0x02972A },
+ { "Etc/GMT-9" , 0x0297B6 },
+ { "Etc/GMT0" , 0x029052 },
+ { "Etc/Greenwich" , 0x029842 },
+ { "Etc/UCT" , 0x029886 },
+ { "Etc/Universal" , 0x0298CA },
+ { "Etc/UTC" , 0x02990E },
+ { "Etc/Zulu" , 0x029952 },
+ { "Europe/Amsterdam" , 0x029996 },
+ { "Europe/Andorra" , 0x029DD4 },
+ { "Europe/Athens" , 0x02A050 },
+ { "Europe/Belfast" , 0x02A393 },
+ { "Europe/Belgrade" , 0x02A8CA },
+ { "Europe/Berlin" , 0x02AB93 },
+ { "Europe/Bratislava" , 0x02AEE9 },
+ { "Europe/Brussels" , 0x02B21B },
+ { "Europe/Bucharest" , 0x02B652 },
+ { "Europe/Budapest" , 0x02B97C },
+ { "Europe/Chisinau" , 0x02BCEF },
+ { "Europe/Copenhagen" , 0x02C07D },
+ { "Europe/Dublin" , 0x02C387 },
+ { "Europe/Gibraltar" , 0x02C898 },
+ { "Europe/Guernsey" , 0x02CCEF },
+ { "Europe/Helsinki" , 0x02D226 },
+ { "Europe/Isle_of_Man" , 0x02D4DC },
+ { "Europe/Istanbul" , 0x02DA13 },
+ { "Europe/Jersey" , 0x02DE00 },
+ { "Europe/Kaliningrad" , 0x02E337 },
+ { "Europe/Kiev" , 0x02E59D },
+ { "Europe/Lisbon" , 0x02E8B4 },
+ { "Europe/Ljubljana" , 0x02EDB8 },
+ { "Europe/London" , 0x02F081 },
+ { "Europe/Luxembourg" , 0x02F5B8 },
+ { "Europe/Madrid" , 0x02FA0E },
+ { "Europe/Malta" , 0x02FDD4 },
+ { "Europe/Mariehamn" , 0x03018D },
+ { "Europe/Minsk" , 0x030443 },
+ { "Europe/Monaco" , 0x030651 },
+ { "Europe/Moscow" , 0x030A8C },
+ { "Europe/Nicosia" , 0x030CDD },
+ { "Europe/Oslo" , 0x030FC5 },
+ { "Europe/Paris" , 0x0312F7 },
+ { "Europe/Podgorica" , 0x03173D },
+ { "Europe/Prague" , 0x031A06 },
+ { "Europe/Riga" , 0x031D38 },
+ { "Europe/Rome" , 0x03207D },
+ { "Europe/Samara" , 0x032440 },
+ { "Europe/San_Marino" , 0x032673 },
+ { "Europe/Sarajevo" , 0x032A36 },
+ { "Europe/Simferopol" , 0x032CFF },
+ { "Europe/Skopje" , 0x03302A },
+ { "Europe/Sofia" , 0x0332F3 },
+ { "Europe/Stockholm" , 0x0335FB },
+ { "Europe/Tallinn" , 0x0338AA },
+ { "Europe/Tirane" , 0x033BE4 },
+ { "Europe/Tiraspol" , 0x033EEA },
+ { "Europe/Uzhgorod" , 0x034278 },
+ { "Europe/Vaduz" , 0x03458F },
+ { "Europe/Vatican" , 0x034822 },
+ { "Europe/Vienna" , 0x034BE5 },
+ { "Europe/Vilnius" , 0x034F12 },
+ { "Europe/Volgograd" , 0x035251 },
+ { "Europe/Warsaw" , 0x035451 },
+ { "Europe/Zagreb" , 0x035832 },
+ { "Europe/Zaporozhye" , 0x035AFB },
+ { "Europe/Zurich" , 0x035E3C },
+ { "Factory" , 0x0360EB },
+ { "GB" , 0x03615C },
+ { "GB-Eire" , 0x036693 },
+ { "GMT" , 0x036BCA },
+ { "GMT+0" , 0x036C96 },
+ { "GMT-0" , 0x036C52 },
+ { "GMT0" , 0x036C0E },
+ { "Greenwich" , 0x036CDA },
+ { "Hongkong" , 0x036D1E },
+ { "HST" , 0x036EE0 },
+ { "Iceland" , 0x036F24 },
+ { "Indian/Antananarivo" , 0x0370DD },
+ { "Indian/Chagos" , 0x037151 },
+ { "Indian/Christmas" , 0x0371B3 },
+ { "Indian/Cocos" , 0x0371F7 },
+ { "Indian/Comoro" , 0x03723B },
+ { "Indian/Kerguelen" , 0x037290 },
+ { "Indian/Mahe" , 0x0372E5 },
+ { "Indian/Maldives" , 0x03733A },
+ { "Indian/Mauritius" , 0x03738F },
+ { "Indian/Mayotte" , 0x037405 },
+ { "Indian/Reunion" , 0x03745A },
+ { "Iran" , 0x0374AF },
+ { "Israel" , 0x03771D },
+ { "Jamaica" , 0x037A4C },
+ { "Japan" , 0x037B11 },
+ { "Kwajalein" , 0x037B9A },
+ { "Libya" , 0x037BFD },
+ { "MET" , 0x037CF7 },
+ { "Mexico/BajaNorte" , 0x038000 },
+ { "Mexico/BajaSur" , 0x038369 },
+ { "Mexico/General" , 0x0385AE },
+ { "MST" , 0x03880C },
+ { "MST7MDT" , 0x038850 },
+ { "Navajo" , 0x038BA1 },
+ { "NZ" , 0x038F1A },
+ { "NZ-CHAT" , 0x039298 },
+ { "Pacific/Apia" , 0x039580 },
+ { "Pacific/Auckland" , 0x03961D },
+ { "Pacific/Chatham" , 0x0399A9 },
+ { "Pacific/Chuuk" , 0x039CA0 },
+ { "Pacific/Easter" , 0x039CF9 },
+ { "Pacific/Efate" , 0x03A057 },
+ { "Pacific/Enderbury" , 0x03A11D },
+ { "Pacific/Fakaofo" , 0x03A18B },
+ { "Pacific/Fiji" , 0x03A1DC },
+ { "Pacific/Funafuti" , 0x03A36F },
+ { "Pacific/Galapagos" , 0x03A3B3 },
+ { "Pacific/Gambier" , 0x03A42B },
+ { "Pacific/Guadalcanal" , 0x03A490 },
+ { "Pacific/Guam" , 0x03A4E5 },
+ { "Pacific/Honolulu" , 0x03A53B },
+ { "Pacific/Johnston" , 0x03A5B2 },
+ { "Pacific/Kiritimati" , 0x03A604 },
+ { "Pacific/Kosrae" , 0x03A66F },
+ { "Pacific/Kwajalein" , 0x03A6CC },
+ { "Pacific/Majuro" , 0x03A738 },
+ { "Pacific/Marquesas" , 0x03A797 },
+ { "Pacific/Midway" , 0x03A7FE },
+ { "Pacific/Nauru" , 0x03A888 },
+ { "Pacific/Niue" , 0x03A900 },
+ { "Pacific/Norfolk" , 0x03A95E },
+ { "Pacific/Noumea" , 0x03A9B3 },
+ { "Pacific/Pago_Pago" , 0x03AA43 },
+ { "Pacific/Palau" , 0x03AACC },
+ { "Pacific/Pitcairn" , 0x03AB10 },
+ { "Pacific/Pohnpei" , 0x03AB65 },
+ { "Pacific/Ponape" , 0x03ABBA },
+ { "Pacific/Port_Moresby" , 0x03ABFF },
+ { "Pacific/Rarotonga" , 0x03AC43 },
+ { "Pacific/Saipan" , 0x03AD1F },
+ { "Pacific/Samoa" , 0x03AD82 },
+ { "Pacific/Tahiti" , 0x03AE0B },
+ { "Pacific/Tarawa" , 0x03AE70 },
+ { "Pacific/Tongatapu" , 0x03AEC4 },
+ { "Pacific/Truk" , 0x03AF50 },
+ { "Pacific/Wake" , 0x03AF95 },
+ { "Pacific/Wallis" , 0x03AFE5 },
+ { "Pacific/Yap" , 0x03B029 },
+ { "Poland" , 0x03B06E },
+ { "Portugal" , 0x03B44F },
+ { "PRC" , 0x03B94B },
+ { "PST8PDT" , 0x03B9FC },
+ { "ROC" , 0x03BD4D },
+ { "ROK" , 0x03BE65 },
+ { "Singapore" , 0x03BF09 },
+ { "Turkey" , 0x03BFC0 },
+ { "UCT" , 0x03C3AD },
+ { "Universal" , 0x03C3F1 },
+ { "US/Alaska" , 0x03C435 },
+ { "US/Aleutian" , 0x03C79E },
+ { "US/Arizona" , 0x03CB04 },
+ { "US/Central" , 0x03CB92 },
+ { "US/East-Indiana" , 0x03D59C },
+ { "US/Eastern" , 0x03D09D },
+ { "US/Hawaii" , 0x03D806 },
+ { "US/Indiana-Starke" , 0x03D877 },
+ { "US/Michigan" , 0x03DBE8 },
+ { "US/Mountain" , 0x03DF1F },
+ { "US/Pacific" , 0x03E298 },
+ { "US/Pacific-New" , 0x03E69D },
+ { "US/Samoa" , 0x03EAA2 },
+ { "UTC" , 0x03EB2B },
+ { "W-SU" , 0x03EE22 },
+ { "WET" , 0x03EB6F },
+ { "Zulu" , 0x03F05C },
};
/* This is a generated file, do not modify */
-const unsigned char timelib_timezone_db_data_builtin[257943] = {
+const unsigned char timelib_timezone_db_data_builtin[258208] = {
/* Africa/Abidjan */
@@ -755,36 +755,36 @@ const unsigned char timelib_timezone_db_data_builtin[257943] = {
/* Africa/Casablanca */
0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C,
+0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C,
0xC6, 0xFF, 0x14, 0x80, 0xC7, 0x58, 0xAC, 0x70, 0xC7, 0xD9, 0xED, 0x80, 0xD2, 0xA1, 0x32, 0xF0,
0xDB, 0x35, 0xA4, 0x00, 0xDB, 0xEE, 0x27, 0xF0, 0xFB, 0x25, 0x72, 0x40, 0xFB, 0xC2, 0xEF, 0x70,
0x08, 0x6B, 0x84, 0x80, 0x08, 0xC6, 0x6D, 0xF0, 0x0B, 0xE8, 0x0C, 0x00, 0x0C, 0x61, 0x47, 0xF0,
0x0D, 0xC9, 0x3F, 0x80, 0x0E, 0x8E, 0xF2, 0x70, 0x0F, 0xD3, 0x51, 0x80, 0x10, 0x27, 0xA3, 0x70,
0x1A, 0xB7, 0xA6, 0x00, 0x1E, 0x18, 0x6F, 0xF0, 0x48, 0x41, 0xE6, 0x80, 0x48, 0xBB, 0x22, 0x70,
0x4A, 0x23, 0x1A, 0x00, 0x4A, 0x8D, 0xD5, 0x70, 0x4B, 0xDC, 0xC0, 0x80, 0x4C, 0x5D, 0xE5, 0x70,
-0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, 0x50, 0x67, 0xA7, 0xA0,
-0x51, 0x7C, 0x82, 0xA0, 0x52, 0x47, 0x89, 0xA0, 0x53, 0x5C, 0x64, 0xA0, 0x54, 0x27, 0x6B, 0xA0,
-0x55, 0x3C, 0x46, 0xA0, 0x56, 0x07, 0x4D, 0xA0, 0x57, 0x1C, 0x28, 0xA0, 0x57, 0xE7, 0x2F, 0xA0,
-0x59, 0x05, 0x45, 0x20, 0x59, 0xC7, 0x11, 0xA0, 0x5A, 0xE5, 0x27, 0x20, 0x5B, 0xB0, 0x2E, 0x20,
-0x5C, 0xC5, 0x09, 0x20, 0x5D, 0x90, 0x10, 0x20, 0x5E, 0xA4, 0xEB, 0x20, 0x5F, 0x6F, 0xF2, 0x20,
-0x60, 0x84, 0xCD, 0x20, 0x61, 0x4F, 0xD4, 0x20, 0x62, 0x64, 0xAF, 0x20, 0x63, 0x2F, 0xB6, 0x20,
-0x64, 0x4D, 0xCB, 0xA0, 0x65, 0x0F, 0x98, 0x20, 0x66, 0x2D, 0xAD, 0xA0, 0x66, 0xF8, 0xB4, 0xA0,
-0x68, 0x0D, 0x8F, 0xA0, 0x68, 0xD8, 0x96, 0xA0, 0x69, 0xED, 0x71, 0xA0, 0x6A, 0xB8, 0x78, 0xA0,
-0x6B, 0xCD, 0x53, 0xA0, 0x6C, 0x98, 0x5A, 0xA0, 0x6D, 0xB6, 0x70, 0x20, 0x6E, 0x78, 0x3C, 0xA0,
-0x6F, 0x96, 0x52, 0x20, 0x70, 0x61, 0x59, 0x20, 0x71, 0x76, 0x34, 0x20, 0x72, 0x41, 0x3B, 0x20,
-0x73, 0x56, 0x16, 0x20, 0x74, 0x21, 0x1D, 0x20, 0x75, 0x35, 0xF8, 0x20, 0x76, 0x00, 0xFF, 0x20,
-0x77, 0x15, 0xDA, 0x20, 0x77, 0xE0, 0xE1, 0x20, 0x78, 0xFE, 0xF6, 0xA0, 0x79, 0xC0, 0xC3, 0x20,
-0x7A, 0xDE, 0xD8, 0xA0, 0x7B, 0xA9, 0xDF, 0xA0, 0x7C, 0xBE, 0xBA, 0xA0, 0x7D, 0x89, 0xC1, 0xA0,
-0x7E, 0x9E, 0x9C, 0xA0, 0x7F, 0x69, 0xA3, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, 0x50, 0x08, 0xBB, 0xA0,
+0x50, 0x31, 0x9A, 0x20, 0x50, 0x67, 0xA7, 0xA0, 0x51, 0x7C, 0x82, 0xA0, 0x52, 0x47, 0x89, 0xA0,
+0x53, 0x5C, 0x64, 0xA0, 0x54, 0x27, 0x6B, 0xA0, 0x55, 0x3C, 0x46, 0xA0, 0x56, 0x07, 0x4D, 0xA0,
+0x57, 0x1C, 0x28, 0xA0, 0x57, 0xE7, 0x2F, 0xA0, 0x59, 0x05, 0x45, 0x20, 0x59, 0xC7, 0x11, 0xA0,
+0x5A, 0xE5, 0x27, 0x20, 0x5B, 0xB0, 0x2E, 0x20, 0x5C, 0xC5, 0x09, 0x20, 0x5D, 0x90, 0x10, 0x20,
+0x5E, 0xA4, 0xEB, 0x20, 0x5F, 0x6F, 0xF2, 0x20, 0x60, 0x84, 0xCD, 0x20, 0x61, 0x4F, 0xD4, 0x20,
+0x62, 0x64, 0xAF, 0x20, 0x63, 0x2F, 0xB6, 0x20, 0x64, 0x4D, 0xCB, 0xA0, 0x65, 0x0F, 0x98, 0x20,
+0x66, 0x2D, 0xAD, 0xA0, 0x66, 0xF8, 0xB4, 0xA0, 0x68, 0x0D, 0x8F, 0xA0, 0x68, 0xD8, 0x96, 0xA0,
+0x69, 0xED, 0x71, 0xA0, 0x6A, 0xB8, 0x78, 0xA0, 0x6B, 0xCD, 0x53, 0xA0, 0x6C, 0x98, 0x5A, 0xA0,
+0x6D, 0xB6, 0x70, 0x20, 0x6E, 0x78, 0x3C, 0xA0, 0x6F, 0x96, 0x52, 0x20, 0x70, 0x61, 0x59, 0x20,
+0x71, 0x76, 0x34, 0x20, 0x72, 0x41, 0x3B, 0x20, 0x73, 0x56, 0x16, 0x20, 0x74, 0x21, 0x1D, 0x20,
+0x75, 0x35, 0xF8, 0x20, 0x76, 0x00, 0xFF, 0x20, 0x77, 0x15, 0xDA, 0x20, 0x77, 0xE0, 0xE1, 0x20,
+0x78, 0xFE, 0xF6, 0xA0, 0x79, 0xC0, 0xC3, 0x20, 0x7A, 0xDE, 0xD8, 0xA0, 0x7B, 0xA9, 0xDF, 0xA0,
+0x7C, 0xBE, 0xBA, 0xA0, 0x7D, 0x89, 0xC1, 0xA0, 0x7E, 0x9E, 0x9C, 0xA0, 0x7F, 0x69, 0xA3, 0xA0,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E,
-0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C,
-0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42,
-0x00, 0x00, 0x00, 0x00,
+0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53,
+0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42, 0x00, 0x00, 0x00, 0x00,
/* Africa/Ceuta */
0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -16768,22 +16768,38 @@ const unsigned char timelib_timezone_db_data_builtin[257943] = {
/* Pacific/Fakaofo */
0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x4E, 0xFD, 0x8B, 0xA0,
-0x01, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xE0, 0x00, 0x00, 0x54, 0x4B, 0x54,
+0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x4E, 0xFD, 0x99, 0xB0,
+0x01, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x00, 0x54, 0x4B, 0x54,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x09, 0x65, 0x00, 0x0D, 0x60, 0x7A, 0x00, 0x00, 0x00,
0x00,
/* Pacific/Fiji */
0x50, 0x48, 0x50, 0x31, 0x01, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x9A, 0x13, 0xB2, 0x3C,
+0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x9A, 0x13, 0xB2, 0x3C,
0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60,
0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xC2, 0xEA, 0x60, 0x4D, 0x72, 0x41, 0xE0,
-0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
-0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, 0x44, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00,
-0x00, 0xA8, 0xC0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4A, 0x53, 0x54, 0x00, 0x46, 0x4A,
-0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82,
-0x00, 0x00, 0x00, 0x00,
+0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x50, 0x82, 0xAE, 0x60, 0x50, 0xFA, 0xA6, 0xE0,
+0x52, 0x62, 0x90, 0x60, 0x52, 0xDA, 0x88, 0xE0, 0x54, 0x42, 0x72, 0x60, 0x54, 0xBA, 0x6A, 0xE0,
+0x56, 0x22, 0x54, 0x60, 0x56, 0xA3, 0x87, 0x60, 0x58, 0x0B, 0x70, 0xE0, 0x58, 0x83, 0x69, 0x60,
+0x59, 0xEB, 0x52, 0xE0, 0x5A, 0x63, 0x4B, 0x60, 0x5B, 0xCB, 0x34, 0xE0, 0x5C, 0x43, 0x2D, 0x60,
+0x5D, 0xAB, 0x16, 0xE0, 0x5E, 0x23, 0x0F, 0x60, 0x5F, 0x8A, 0xF8, 0xE0, 0x60, 0x0C, 0x2B, 0xE0,
+0x61, 0x74, 0x15, 0x60, 0x61, 0xEC, 0x0D, 0xE0, 0x63, 0x53, 0xF7, 0x60, 0x63, 0xCB, 0xEF, 0xE0,
+0x65, 0x33, 0xD9, 0x60, 0x65, 0xAB, 0xD1, 0xE0, 0x67, 0x13, 0xBB, 0x60, 0x67, 0x8B, 0xB3, 0xE0,
+0x68, 0xF3, 0x9D, 0x60, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xD3, 0x7F, 0x60, 0x6B, 0x54, 0xB2, 0x60,
+0x6C, 0xBC, 0x9B, 0xE0, 0x6D, 0x34, 0x94, 0x60, 0x6E, 0x9C, 0x7D, 0xE0, 0x6F, 0x14, 0x76, 0x60,
+0x70, 0x7C, 0x5F, 0xE0, 0x70, 0xF4, 0x58, 0x60, 0x72, 0x5C, 0x41, 0xE0, 0x72, 0xD4, 0x3A, 0x60,
+0x74, 0x3C, 0x23, 0xE0, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x25, 0x40, 0x60, 0x76, 0x9D, 0x38, 0xE0,
+0x78, 0x05, 0x22, 0x60, 0x78, 0x7D, 0x1A, 0xE0, 0x79, 0xE5, 0x04, 0x60, 0x7A, 0x5C, 0xFC, 0xE0,
+0x7B, 0xC4, 0xE6, 0x60, 0x7C, 0x3C, 0xDE, 0xE0, 0x7D, 0xA4, 0xC8, 0x60, 0x7E, 0x1C, 0xC0, 0xE0,
+0x7F, 0x84, 0xAA, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01,
+0x02, 0x01, 0x00, 0x00, 0xA7, 0x44, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00,
+0xA8, 0xC0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4A, 0x53, 0x54, 0x00, 0x46, 0x4A, 0x54,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00,
+0x00, 0x00, 0x00,
/* Pacific/Funafuti */
0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -18175,4 +18191,4 @@ const unsigned char timelib_timezone_db_data_builtin[257943] = {
0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80,
0x00, 0x00, 0x00, 0x00, };
-const timelib_tzdb timezonedb_builtin = { "2012.3", 576, timezonedb_idx_builtin, timelib_timezone_db_data_builtin };
+const timelib_tzdb timezonedb_builtin = { "2012.6", 576, timezonedb_idx_builtin, timelib_timezone_db_data_builtin };
diff --git a/ext/date/tests/bug62561.phpt b/ext/date/tests/bug62561.phpt
new file mode 100644
index 0000000000..0ed32c15a1
--- /dev/null
+++ b/ext/date/tests/bug62561.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #62561 Unixtimestamp may take on local times DST flag (this test will only be valid during EDT)
+--FILE--
+<?php
+$tz = new DateTimeZone('America/New_York');
+$ts = new DateTime('@1341115200', $tz);
+$int = new DateInterval('P1D');
+$dayFromTs = new DateTime('@1341115200', new DateTimeZone('America/New_York'));
+$dayFromTs->add($int);
+
+echo 'ts: '.$ts->format('Y-m-d H:i:s')."\n";
+echo 'day from ts: '.$dayFromTs->format('Y-m-d H:i:s')."\n";
+?>
+--EXPECT--
+ts: 2012-07-01 04:00:00
+day from ts: 2012-07-02 04:00:00
diff --git a/ext/date/tests/bug62896.phpt b/ext/date/tests/bug62896.phpt
new file mode 100644
index 0000000000..7584546b5a
--- /dev/null
+++ b/ext/date/tests/bug62896.phpt
@@ -0,0 +1,40 @@
+--TEST--
+Bug #62896 Unixtimestamp may take on local times DST flag (this test will only be valid during CEST)
+--FILE--
+<?php
+ $tz = new DateTimeZone('Europe/Berlin');
+
+ echo "FROM TIMESTAMP, NO TZ:\n";
+
+ $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST'));
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+
+ $date->modify('+0 days');
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+
+ echo "FROM TIMESTAMP, WITH TZ:\n";
+
+ $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST'));
+ $date->setTimezone($tz);
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+
+ $date->modify('+0 days');
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+
+ echo "FROM STRING:\n";
+
+ $date = new DateTime('2012-08-22 00:00:00 CEST', $tz);
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+
+ $date->modify('+0 days');
+ echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n";
+--EXPECT--
+FROM TIMESTAMP, NO TZ:
+2012-08-21 22:00:00 GMT+0000 (offset 0)
+2012-08-21 22:00:00 GMT+0000 (offset 0)
+FROM TIMESTAMP, WITH TZ:
+2012-08-22 00:00:00 CEST (offset 7200)
+2012-08-22 00:00:00 CEST (offset 7200)
+FROM STRING:
+2012-08-22 00:00:00 CEST (offset 7200)
+2012-08-22 00:00:00 CEST (offset 7200)
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 8fa0adec92..cfcc3e876c 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -1328,6 +1328,11 @@ PHP_MINFO_FUNCTION(gd)
#endif
#if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
php_info_print_table_row(2, "XPM Support", "enabled");
+ {
+ char tmp[12];
+ snprintf(tmp, sizeof(tmp), "%d", XpmLibraryVersion());
+ php_info_print_table_row(2, "libXpm Version", tmp);
+ }
#endif
#ifdef HAVE_GD_XBM
php_info_print_table_row(2, "XBM Support", "enabled");
diff --git a/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt b/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt
index 5107cd32b6..f0b2b0182c 100644
--- a/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt
+++ b/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt
@@ -5,9 +5,9 @@ Pawel Krynicki <pawel [dot] krynicki [at] xsolve [dot] pl>
#testfest AmsterdamPHP 2012-06-23
--FILE--
<?php
-$depth0 = md5('recursiveDirectoryIterator::getSubPath');
-$depth1 = md5('depth1');
-$depth2 = md5('depth2');
+$depth0 = "depth0";
+$depth1 = 'depth1';
+$depth2 = 'depth2';
$targetDir = __DIR__ . DIRECTORY_SEPARATOR . $depth0 . DIRECTORY_SEPARATOR . $depth1 . DIRECTORY_SEPARATOR . $depth2;
mkdir($targetDir, 0777, true);
touch($targetDir . DIRECTORY_SEPARATOR . 'getSubPath_test.tmp');
@@ -24,29 +24,27 @@ foreach ($list as $item) {
echo $item . "\n";
}
?>
-==DONE==
--CLEAN--
<?php
function rrmdir($dir) {
- foreach(glob($dir . '/*') as $file) {
- if(is_dir($file)) {
+ foreach(glob($dir . '/*') as $file) {
+ if(is_dir($file)) {
rrmdir($file);
- } else {
+ } else {
unlink($file);
- }
- }
+ }
+ }
- rmdir($dir);
- }
+ rmdir($dir);
+}
- $targetDir = __DIR__.DIRECTORY_SEPARATOR.md5('recursiveDirectoryIterator::getSubPath');
- rrmdir($targetDir);
+$targetDir = __DIR__.DIRECTORY_SEPARATOR . "depth0";
+rrmdir($targetDir);
?>
---EXPECT--
-a0c967a6c2c34786e4802f59af9356f5
-a0c967a6c2c34786e4802f59af9356f5
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507
-==DONE==
+--EXPECTF--
+depth1
+depth1
+depth1%cdepth2
+depth1%cdepth2
+depth1%cdepth2
diff --git a/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt b/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt
index 4e17ea9d42..7b12672e14 100644
--- a/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt
+++ b/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt
@@ -5,9 +5,9 @@ Pawel Krynicki <pawel [dot] krynicki [at] xsolve [dot] pl>
#testfest AmsterdamPHP 2012-06-23
--FILE--
<?php
-$depth0 = md5('recursiveDirectoryIterator::getSubPathname');
-$depth1 = md5('depth1');
-$depth2 = md5('depth2');
+$depth0 = "depth0";
+$depth1 = "depth1";
+$depth2 = "depth2";
$targetDir = __DIR__ . DIRECTORY_SEPARATOR . $depth0 . DIRECTORY_SEPARATOR . $depth1 . DIRECTORY_SEPARATOR . $depth2;
mkdir($targetDir, 0777, true);
touch($targetDir . DIRECTORY_SEPARATOR . 'getSubPathname_test_2.tmp');
@@ -17,6 +17,7 @@ $iterator = new RecursiveDirectoryIterator(__DIR__ . DIRECTORY_SEPARATOR . $dept
$it = new RecursiveIteratorIterator($iterator);
$list = [];
+$it->rewind(); //see https://bugs.php.net/bug.php?id=62914
while($it->valid()) {
$list[] = $it->getSubPathname();
$it->next();
@@ -26,7 +27,6 @@ foreach ($list as $item) {
echo $item . "\n";
}
?>
-==DONE==
--CLEAN--
<?php
function rrmdir($dir) {
@@ -41,18 +41,16 @@ function rrmdir($dir) {
rmdir($dir);
}
-$targetDir = __DIR__ . DIRECTORY_SEPARATOR . md5('recursiveDirectoryIterator::getSubPathname');
+$targetDir = __DIR__ . DIRECTORY_SEPARATOR . "depth0";
rrmdir($targetDir);
?>
---EXPECT--
-.
+--EXPECTF--
.
..
-a0c967a6c2c34786e4802f59af9356f5/.
-a0c967a6c2c34786e4802f59af9356f5/..
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507/.
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507/..
-a0c967a6c2c34786e4802f59af9356f5/9925aabb545352472e4d77942627b507/getSubPathname_test_2.tmp
-a0c967a6c2c34786e4802f59af9356f5/getSubPathname_test_3.tmp
+depth1%c.
+depth1%c..
+depth1%cdepth2%c.
+depth1%cdepth2%c..
+depth1%cdepth2%cgetSubPathname_test_2.tmp
+depth1%cgetSubPathname_test_3.tmp
getSubPathname_test_1.tmp
-==DONE==
diff --git a/ext/standard/tests/network/gethostbyname_basic001.phpt b/ext/standard/tests/network/gethostbyname_basic001.phpt
index e917b59920..9171e226aa 100644
--- a/ext/standard/tests/network/gethostbyname_basic001.phpt
+++ b/ext/standard/tests/network/gethostbyname_basic001.phpt
@@ -5,6 +5,7 @@ gethostbyname() function - basic type return test
--SKIPIF--
<?php
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+if (getenv("SKIP_ONLINE_TESTS")) die("skip test requiring internet connection");
?>
--FILE--
<?php
diff --git a/ext/standard/tests/network/gethostbyname_basic002.phpt b/ext/standard/tests/network/gethostbyname_basic002.phpt
deleted file mode 100644
index 983faa929e..0000000000
--- a/ext/standard/tests/network/gethostbyname_basic002.phpt
+++ /dev/null
@@ -1,15 +0,0 @@
---TEST--
-gethostbyname() function - basic invalid parameter test
---CREDITS--
-"Sylvain R." <sracine@phpquebec.org>
---SKIPIF--
-<?php
-if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
-?>
---FILE--
-<?php
- $ip = gethostbyname("www.php.net");
- var_dump((bool) ip2long($ip));
-?>
---EXPECT--
-bool(true)
diff --git a/ext/standard/tests/network/gethostbyname_error004.phpt b/ext/standard/tests/network/gethostbyname_error004.phpt
index 7aac172920..274301a236 100644
--- a/ext/standard/tests/network/gethostbyname_error004.phpt
+++ b/ext/standard/tests/network/gethostbyname_error004.phpt
@@ -5,6 +5,7 @@ gethostbyname() function - basic return valid ip address test
--SKIPIF--
<?php
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+if (getenv("SKIP_ONLINE_TESTS")) die("skip test requiring internet connection");
?>
--FILE--
<?php
diff --git a/ext/standard/tests/network/getmxrr.phpt b/ext/standard/tests/network/getmxrr.phpt
index 29cea1d71e..c4a15c52ce 100644
--- a/ext/standard/tests/network/getmxrr.phpt
+++ b/ext/standard/tests/network/getmxrr.phpt
@@ -3,6 +3,7 @@ getmxrr() test
--SKIPIF--
<?php
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
+if (getenv("SKIP_ONLINE_TESTS")) die("skip test requiring internet connection");
if (substr(PHP_OS, 0, 3) == 'WIN') {
die('skip: no Windows support');
}
diff --git a/ext/standard/tests/serialize/bug35895.phpt b/ext/standard/tests/serialize/bug35895.phpt
new file mode 100644
index 0000000000..22fce0d1f2
--- /dev/null
+++ b/ext/standard/tests/serialize/bug35895.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #35895 (__sleep and private property)
+--FILE--
+<?php
+class Parents {
+ private $parents;
+ public function __sleep() {
+ return array("parents");
+ }
+}
+
+class Child extends Parents {
+ private $child;
+ public function __sleep() {
+ return array_merge(array("child"), parent::__sleep());
+ }
+}
+
+$obj = new Child();
+serialize($obj);
+
+?>
+--EXPECTF--
+Notice: serialize(): "parents" returned as member variable from __sleep() but does not exist in %sbug35895.php on line %d
diff --git a/ext/standard/tests/url/bug63162.phpt b/ext/standard/tests/url/bug63162.phpt
new file mode 100644
index 0000000000..ea5205efd6
--- /dev/null
+++ b/ext/standard/tests/url/bug63162.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Test parse_url() for bug #63162
+--DESCRIPTION--
+This test covers tests the inputs:
+[0]=> http://user:pass@host
+[1]=> //user:pass@host
+[2]=> //user@host
+--FILE--
+<?php
+var_dump(parse_url('http://user:pass@host'));
+var_dump(parse_url('//user:pass@host'));
+var_dump(parse_url('//user@host'));
+?>
+--EXPECT--
+array(4) {
+ ["scheme"]=>
+ string(4) "http"
+ ["host"]=>
+ string(4) "host"
+ ["user"]=>
+ string(4) "user"
+ ["pass"]=>
+ string(4) "pass"
+}
+array(3) {
+ ["host"]=>
+ string(4) "host"
+ ["user"]=>
+ string(4) "user"
+ ["pass"]=>
+ string(4) "pass"
+}
+array(2) {
+ ["host"]=>
+ string(4) "host"
+ ["user"]=>
+ string(4) "user"
+}
diff --git a/ext/standard/url.c b/ext/standard/url.c
index 44a568032b..c159322837 100644
--- a/ext/standard/url.c
+++ b/ext/standard/url.c
@@ -201,6 +201,8 @@ PHPAPI php_url *php_url_parse_ex(char const *str, int length)
STR_FREE(ret->scheme);
efree(ret);
return NULL;
+ } else if (*s == '/' && *(s+1) == '/') { /* relative-scheme URL */
+ s += 2;
} else {
goto just_path;
}
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 494fb583c7..a4fa262e76 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -639,6 +639,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
HashPosition pos;
int i;
zval nval, *nvalp;
+ HashTable *propers;
ZVAL_NULL(&nval);
nvalp = &nval;
@@ -664,7 +665,8 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
smart_str_appendl(buf,"N;", 2);
continue;
}
- if (zend_hash_find(Z_OBJPROP_P(struc), Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) {
+ propers = Z_OBJPROP_P(struc);
+ if (zend_hash_find(propers, Z_STRVAL_PP(name), Z_STRLEN_PP(name) + 1, (void *) &d) == SUCCESS) {
php_var_serialize_string(buf, Z_STRVAL_PP(name), Z_STRLEN_PP(name));
php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC);
} else {
@@ -676,7 +678,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
do {
zend_mangle_property_name(&priv_name, &prop_name_length, ce->name, ce->name_length, Z_STRVAL_PP(name), Z_STRLEN_PP(name), ce->type & ZEND_INTERNAL_CLASS);
- if (zend_hash_find(Z_OBJPROP_P(struc), priv_name, prop_name_length + 1, (void *) &d) == SUCCESS) {
+ if (zend_hash_find(propers, priv_name, prop_name_length + 1, (void *) &d) == SUCCESS) {
php_var_serialize_string(buf, priv_name, prop_name_length);
pefree(priv_name, ce->type & ZEND_INTERNAL_CLASS);
php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC);
@@ -684,7 +686,7 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
}
pefree(priv_name, ce->type & ZEND_INTERNAL_CLASS);
zend_mangle_property_name(&prot_name, &prop_name_length, "*", 1, Z_STRVAL_PP(name), Z_STRLEN_PP(name), ce->type & ZEND_INTERNAL_CLASS);
- if (zend_hash_find(Z_OBJPROP_P(struc), prot_name, prop_name_length + 1, (void *) &d) == SUCCESS) {
+ if (zend_hash_find(propers, prot_name, prop_name_length + 1, (void *) &d) == SUCCESS) {
php_var_serialize_string(buf, prot_name, prop_name_length);
pefree(prot_name, ce->type & ZEND_INTERNAL_CLASS);
php_var_serialize_intern(buf, *d, var_hash TSRMLS_CC);
diff --git a/main/php_version.h b/main/php_version.h
index 0efdef14a5..8dfe49630f 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -2,7 +2,7 @@
/* edit configure.in to change version number */
#define PHP_MAJOR_VERSION 5
#define PHP_MINOR_VERSION 4
-#define PHP_RELEASE_VERSION 8
+#define PHP_RELEASE_VERSION 9
#define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "5.4.8-dev"
-#define PHP_VERSION_ID 50408
+#define PHP_VERSION "5.4.9-dev"
+#define PHP_VERSION_ID 50409
diff --git a/run-tests.php b/run-tests.php
index cfc562ebc1..a746c36965 100755
--- a/run-tests.php
+++ b/run-tests.php
@@ -632,6 +632,9 @@ if (isset($argc) && $argc > 1) {
case 'x':
$environment['SKIP_SLOW_TESTS'] = 1;
break;
+ case '--offline':
+ $environment['SKIP_ONLINE_TESTS'] = 1;
+ break;
//case 'w'
case '-':
// repeat check with full switch
@@ -689,6 +692,8 @@ Options:
-x Sets 'SKIP_SLOW_TESTS' environmental variable.
+ --offline Sets 'SKIP_ONLINE_TESTS' environmental variable.
+
--verbose
-v Verbose mode.
diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4
index ad46717acd..6191c329ba 100644
--- a/sapi/fpm/config.m4
+++ b/sapi/fpm/config.m4
@@ -587,12 +587,16 @@ if test "$PHP_FPM" != "no"; then
AC_DEFINE_UNQUOTED(PHP_FPM_USER, "$php_fpm_user", [fpm user name])
AC_DEFINE_UNQUOTED(PHP_FPM_GROUP, "$php_fpm_group", [fpm group name])
+ AC_DEFINE_UNQUOTED(PHP_FPM_USER, "$php_fpm_user", [fpm user name])
+ AC_DEFINE_UNQUOTED(PHP_FPM_GROUP, "$php_fpm_group", [fpm group name])
+
PHP_ADD_BUILD_DIR(sapi/fpm/fpm)
PHP_ADD_BUILD_DIR(sapi/fpm/fpm/events)
- PHP_OUTPUT(sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.8 sapi/fpm/status.html)
+ PHP_OUTPUT(sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html)
PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/fpm/Makefile.frag])
SAPI_FPM_PATH=sapi/fpm/php-fpm
+
if test "$fpm_trace_type" && test -f "$abs_srcdir/sapi/fpm/fpm/fpm_trace_$fpm_trace_type.c"; then
PHP_FPM_TRACE_FILES="fpm/fpm_trace.c fpm/fpm_trace_$fpm_trace_type.c"
diff --git a/sapi/fpm/fpm/fpm.c b/sapi/fpm/fpm/fpm.c
index dab415d123..b866f37f2d 100644
--- a/sapi/fpm/fpm/fpm.c
+++ b/sapi/fpm/fpm/fpm.c
@@ -39,10 +39,10 @@ struct fpm_globals_s fpm_globals = {
.test_successful = 0,
.heartbeat = 0,
.run_as_root = 0,
- .send_config_signal = 0,
+ .send_config_pipe = {0, 0},
};
-int fpm_init(int argc, char **argv, char *config, char *prefix, char *pid, int test_conf, int run_as_root) /* {{{ */
+int fpm_init(int argc, char **argv, char *config, char *prefix, char *pid, int test_conf, int run_as_root, int force_daemon) /* {{{ */
{
fpm_globals.argc = argc;
fpm_globals.argv = argv;
@@ -55,7 +55,7 @@ int fpm_init(int argc, char **argv, char *config, char *prefix, char *pid, int t
if (0 > fpm_php_init_main() ||
0 > fpm_stdio_init_main() ||
- 0 > fpm_conf_init_main(test_conf) ||
+ 0 > fpm_conf_init_main(test_conf, force_daemon) ||
0 > fpm_unix_init_main() ||
0 > fpm_scoreboard_init_main() ||
0 > fpm_pctl_init_main() ||
diff --git a/sapi/fpm/fpm/fpm.h b/sapi/fpm/fpm/fpm.h
index 7a2903d07d..65d0e0d691 100644
--- a/sapi/fpm/fpm/fpm.h
+++ b/sapi/fpm/fpm/fpm.h
@@ -37,7 +37,7 @@
int fpm_run(int *max_requests);
-int fpm_init(int argc, char **argv, char *config, char *prefix, char *pid, int test_conf, int run_as_root);
+int fpm_init(int argc, char **argv, char *config, char *prefix, char *pid, int test_conf, int run_as_root, int force_daemon);
struct fpm_globals_s {
pid_t parent_pid;
@@ -55,7 +55,7 @@ struct fpm_globals_s {
int test_successful;
int heartbeat;
int run_as_root;
- int send_config_signal;
+ int send_config_pipe[2];
};
extern struct fpm_globals_s fpm_globals;
diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c
index dfe6792c05..25e2cc43a1 100644
--- a/sapi/fpm/fpm/fpm_conf.c
+++ b/sapi/fpm/fpm/fpm_conf.c
@@ -1115,7 +1115,7 @@ int fpm_conf_write_pid() /* {{{ */
}
/* }}} */
-static int fpm_conf_post_process(TSRMLS_D) /* {{{ */
+static int fpm_conf_post_process(int force_daemon TSRMLS_DC) /* {{{ */
{
struct fpm_worker_pool_s *wp;
@@ -1123,6 +1123,11 @@ static int fpm_conf_post_process(TSRMLS_D) /* {{{ */
fpm_evaluate_full_path(&fpm_global_config.pid_file, NULL, PHP_LOCALSTATEDIR, 0);
}
+ if (force_daemon >= 0) {
+ /* forced from command line options */
+ fpm_global_config.daemonize = force_daemon;
+ }
+
fpm_globals.log_level = fpm_global_config.log_level;
if (fpm_global_config.process_max < 0) {
@@ -1584,7 +1589,7 @@ static void fpm_conf_dump() /* {{{ */
}
/* }}} */
-int fpm_conf_init_main(int test_conf) /* {{{ */
+int fpm_conf_init_main(int test_conf, int force_daemon) /* {{{ */
{
int ret;
TSRMLS_FETCH();
@@ -1630,7 +1635,7 @@ int fpm_conf_init_main(int test_conf) /* {{{ */
return -1;
}
- if (0 > fpm_conf_post_process(TSRMLS_C)) {
+ if (0 > fpm_conf_post_process(force_daemon TSRMLS_CC)) {
zlog(ZLOG_ERROR, "failed to post process the configuration");
return -1;
}
diff --git a/sapi/fpm/fpm/fpm_conf.h b/sapi/fpm/fpm/fpm_conf.h
index f780f03891..dc54133d43 100644
--- a/sapi/fpm/fpm/fpm_conf.h
+++ b/sapi/fpm/fpm/fpm_conf.h
@@ -97,7 +97,7 @@ enum {
PM_STYLE_ONDEMAND = 3
};
-int fpm_conf_init_main(int test_conf);
+int fpm_conf_init_main(int test_conf, int force_daemon);
int fpm_worker_pool_config_free(struct fpm_worker_pool_config_s *wpc);
int fpm_conf_write_pid();
int fpm_conf_unlink_pid();
diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
index cdec235bdd..edd75be5ae 100644
--- a/sapi/fpm/fpm/fpm_main.c
+++ b/sapi/fpm/fpm/fpm_main.c
@@ -155,6 +155,8 @@ static const opt_struct OPTIONS[] = {
{'p', 1, "prefix"},
{'g', 1, "pid"},
{'R', 0, "allow-to-run-as-root"},
+ {'D', 0, "daemonize"},
+ {'F', 0, "nodaemonize"},
{'-', 0, NULL} /* end of args */
};
@@ -912,7 +914,7 @@ static void php_cgi_usage(char *argv0)
prog = "php";
}
- php_printf( "Usage: %s [-n] [-e] [-h] [-i] [-m] [-v] [-t] [-p <prefix>] [-g <pid>] [-c <file>] [-d foo[=bar]] [-y <file>]\n"
+ php_printf( "Usage: %s [-n] [-e] [-h] [-i] [-m] [-v] [-t] [-p <prefix>] [-g <pid>] [-c <file>] [-d foo[=bar]] [-y <file>] [-D] [-F]\n"
" -c <path>|<file> Look for php.ini file in this directory\n"
" -n No php.ini file will be used\n"
" -d foo[=bar] Define INI entry foo with value 'bar'\n"
@@ -928,6 +930,9 @@ static void php_cgi_usage(char *argv0)
" -y, --fpm-config <file>\n"
" Specify alternative path to FastCGI process manager config file.\n"
" -t, --test Test FPM configuration and exit\n"
+ " -D, --daemonize force to run in background, and ignore daemonize option from config file\n"
+ " -F, --nodaemonize\n"
+ " force to stay in foreground, and ignore daemonize option from config file\n"
" -R, --allow-to-run-as-root\n"
" Allow pool to run as root (disabled by default)\n",
prog, PHP_PREFIX);
@@ -1550,6 +1555,7 @@ int main(int argc, char *argv[])
char *fpm_prefix = NULL;
char *fpm_pid = NULL;
int test_conf = 0;
+ int force_daemon = -1;
int php_information = 0;
int php_allow_to_run_as_root = 0;
@@ -1670,6 +1676,14 @@ int main(int argc, char *argv[])
php_allow_to_run_as_root = 1;
break;
+ case 'D': /* daemonize */
+ force_daemon = 1;
+ break;
+
+ case 'F': /* nodaemonize */
+ force_daemon = 0;
+ break;
+
default:
case 'h':
case '?':
@@ -1797,18 +1811,22 @@ consult the installation file that came with this distribution, or visit \n\
}
}
- if (0 > fpm_init(argc, argv, fpm_config ? fpm_config : CGIG(fpm_config), fpm_prefix, fpm_pid, test_conf, php_allow_to_run_as_root)) {
+ if (0 > fpm_init(argc, argv, fpm_config ? fpm_config : CGIG(fpm_config), fpm_prefix, fpm_pid, test_conf, php_allow_to_run_as_root, force_daemon)) {
- if (fpm_globals.send_config_signal) {
- zlog(ZLOG_DEBUG, "Sending SIGUSR2 (error) to parent %d", getppid());
- kill(getppid(), SIGUSR2);
+ if (fpm_globals.send_config_pipe[1]) {
+ int writeval = 0;
+ zlog(ZLOG_DEBUG, "Sending \"0\" (error) to parent via fd=%d", fpm_globals.send_config_pipe[1]);
+ write(fpm_globals.send_config_pipe[1], &writeval, sizeof(writeval));
+ close(fpm_globals.send_config_pipe[1]);
}
return FPM_EXIT_CONFIG;
}
- if (fpm_globals.send_config_signal) {
- zlog(ZLOG_DEBUG, "Sending SIGUSR1 (OK) to parent %d", getppid());
- kill(getppid(), SIGUSR1);
+ if (fpm_globals.send_config_pipe[1]) {
+ int writeval = 1;
+ zlog(ZLOG_DEBUG, "Sending \"1\" (OK) to parent via fd=%d", fpm_globals.send_config_pipe[1]);
+ write(fpm_globals.send_config_pipe[1], &writeval, sizeof(writeval));
+ close(fpm_globals.send_config_pipe[1]);
}
fpm_is_running = 1;
diff --git a/sapi/fpm/fpm/fpm_signals.c b/sapi/fpm/fpm/fpm_signals.c
index 656269f1a3..8993a860ae 100644
--- a/sapi/fpm/fpm/fpm_signals.c
+++ b/sapi/fpm/fpm/fpm_signals.c
@@ -249,15 +249,3 @@ int fpm_signals_get_fd() /* {{{ */
}
/* }}} */
-void fpm_signals_sighandler_exit_ok(pid_t pid) /* {{{ */
-{
- exit(FPM_EXIT_OK);
-}
-/* }}} */
-
-void fpm_signals_sighandler_exit_config(pid_t pid) /* {{{ */
-{
- exit(FPM_EXIT_CONFIG);
-}
-/* }}} */
-
diff --git a/sapi/fpm/fpm/fpm_signals.h b/sapi/fpm/fpm/fpm_signals.h
index 13484cbac2..eb80faecfd 100644
--- a/sapi/fpm/fpm/fpm_signals.h
+++ b/sapi/fpm/fpm/fpm_signals.h
@@ -11,9 +11,6 @@ int fpm_signals_init_main();
int fpm_signals_init_child();
int fpm_signals_get_fd();
-void fpm_signals_sighandler_exit_ok(pid_t pid);
-void fpm_signals_sighandler_exit_config(pid_t pid);
-
extern const char *fpm_signal_names[NSIG + 1];
#endif
diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c
index b9b9a8c0b6..2363b57f80 100644
--- a/sapi/fpm/fpm/fpm_status.c
+++ b/sapi/fpm/fpm/fpm_status.c
@@ -148,7 +148,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"<tr><th>start time</th><td>%s</td></tr>\n"
"<tr><th>start since</th><td>%lu</td></tr>\n"
"<tr><th>accepted conn</th><td>%lu</td></tr>\n"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"<tr><th>listen queue</th><td>%u</td></tr>\n"
"<tr><th>max listen queue</th><td>%u</td></tr>\n"
"<tr><th>listen queue len</th><td>%d</td></tr>\n"
@@ -178,7 +178,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"<th>content length</th>"
"<th>user</th>"
"<th>script</th>"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"<th>last request cpu</th>"
#endif
"<th>last request memory</th>"
@@ -197,7 +197,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"<td>%zu</td>"
"<td>%s</td>"
"<td>%s</td>"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"<td>%.2f</td>"
#endif
"<td>%zu</td>"
@@ -220,7 +220,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"<start-time>%s</start-time>\n"
"<start-since>%lu</start-since>\n"
"<accepted-conn>%lu</accepted-conn>\n"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"<listen-queue>%u</listen-queue>\n"
"<max-listen-queue>%u</max-listen-queue>\n"
"<listen-queue-len>%d</listen-queue-len>\n"
@@ -249,7 +249,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"<content-length>%zu</content-length>"
"<user>%s</user>"
"<script>%s</script>"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"<last-request-cpu>%.2f</last-request-cpu>"
#endif
"<last-request-memory>%zu</last-request-memory>"
@@ -270,7 +270,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"\"start time\":%s,"
"\"start since\":%lu,"
"\"accepted conn\":%lu,"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"\"listen queue\":%u,"
"\"max listen queue\":%u,"
"\"listen queue len\":%d,"
@@ -300,7 +300,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"\"content length\":%zu,"
"\"user\":\"%s\","
"\"script\":\"%s\","
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"\"last request cpu\":%.2f,"
#endif
"\"last request memory\":%zu"
@@ -320,7 +320,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
"start time: %s\n"
"start since: %lu\n"
"accepted conn: %lu\n"
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
"listen queue: %u\n"
"max listen queue: %u\n"
"listen queue len: %d\n"
@@ -362,7 +362,7 @@ int fpm_status_handle_request(TSRMLS_D) /* {{{ */
time_buffer,
now_epoch - scoreboard.start_epoch,
scoreboard.requests,
-#if HAVE_FPM_LQ
+#ifdef HAVE_FPM_LQ
scoreboard.lq,
scoreboard.lq_max,
scoreboard.lq_len,
diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c
index 5c5e37c3a4..48249e8a49 100644
--- a/sapi/fpm/fpm/fpm_unix.c
+++ b/sapi/fpm/fpm/fpm_unix.c
@@ -121,16 +121,16 @@ static int fpm_unix_conf_wp(struct fpm_worker_pool_s *wp) /* {{{ */
}
} else { /* not root */
if (wp->config->user && *wp->config->user) {
- zlog(ZLOG_WARNING, "[pool %s] 'user' directive is ignored when FPM is not running as root", wp->config->name);
+ zlog(ZLOG_NOTICE, "[pool %s] 'user' directive is ignored when FPM is not running as root", wp->config->name);
}
if (wp->config->group && *wp->config->group) {
- zlog(ZLOG_WARNING, "[pool %s] 'group' directive is ignored when FPM is not running as root", wp->config->name);
+ zlog(ZLOG_NOTICE, "[pool %s] 'group' directive is ignored when FPM is not running as root", wp->config->name);
}
if (wp->config->chroot && *wp->config->chroot) {
- zlog(ZLOG_WARNING, "[pool %s] 'chroot' directive is ignored when FPM is not running as root", wp->config->name);
+ zlog(ZLOG_NOTICE, "[pool %s] 'chroot' directive is ignored when FPM is not running as root", wp->config->name);
}
if (wp->config->process_priority != 64) {
- zlog(ZLOG_WARNING, "[pool %s] 'process.priority' directive is ignored when FPM is not running as root", wp->config->name);
+ zlog(ZLOG_NOTICE, "[pool %s] 'process.priority' directive is ignored when FPM is not running as root", wp->config->name);
}
/* set up HOME and USER anyway */
@@ -262,36 +262,19 @@ int fpm_unix_init_main() /* {{{ */
* The parent process has then to wait for the master
* process to initialize to return a consistent exit
* value. For this pupose, the master process will
- * send USR1 if everything went well and USR2
- * otherwise.
+ * send \"1\" into the pipe if everything went well
+ * and \"0\" otherwise.
*/
- struct sigaction act;
- struct sigaction oldact_usr1;
- struct sigaction oldact_usr2;
- struct timeval tv;
- /*
- * set sigaction for USR1 before fork
- * save old sigaction to restore it after
- * fork in the child process (the master process)
- */
- memset(&act, 0, sizeof(act));
- memset(&act, 0, sizeof(oldact_usr1));
- act.sa_handler = fpm_signals_sighandler_exit_ok;
- sigfillset(&act.sa_mask);
- sigaction(SIGUSR1, &act, &oldact_usr1);
+ struct timeval tv;
+ fd_set rfds;
+ int ret;
- /*
- * set sigaction for USR2 before fork
- * save old sigaction to restore it after
- * fork in the child process (the master process)
- */
- memset(&act, 0, sizeof(act));
- memset(&act, 0, sizeof(oldact_usr2));
- act.sa_handler = fpm_signals_sighandler_exit_config;
- sigfillset(&act.sa_mask);
- sigaction(SIGUSR2, &act, &oldact_usr2);
+ if (pipe(fpm_globals.send_config_pipe) == -1) {
+ zlog(ZLOG_SYSERROR, "failed to create pipe");
+ return -1;
+ }
/* then fork */
pid_t pid = fork();
@@ -302,24 +285,54 @@ int fpm_unix_init_main() /* {{{ */
return -1;
case 0 : /* children */
- /* restore USR1 and USR2 sigaction */
- sigaction(SIGUSR1, &oldact_usr1, NULL);
- sigaction(SIGUSR2, &oldact_usr2, NULL);
- fpm_globals.send_config_signal = 1;
+ close(fpm_globals.send_config_pipe[0]); /* close the read side of the pipe */
break;
default : /* parent */
- fpm_cleanups_run(FPM_CLEANUP_PARENT_EXIT);
+ close(fpm_globals.send_config_pipe[1]); /* close the write side of the pipe */
/*
* wait for 10s before exiting with error
- * the child is supposed to send USR1 or USR2 to tell the parent
+ * the child is supposed to send 1 or 0 into the pipe to tell the parent
* how it goes for it
*/
+ FD_ZERO(&rfds);
+ FD_SET(fpm_globals.send_config_pipe[0], &rfds);
+
tv.tv_sec = 10;
tv.tv_usec = 0;
- zlog(ZLOG_DEBUG, "The calling process is waiting for the master process to ping");
- select(0, NULL, NULL, NULL, &tv);
+
+ zlog(ZLOG_DEBUG, "The calling process is waiting for the master process to ping via fd=%d", fpm_globals.send_config_pipe[0]);
+ ret = select(fpm_globals.send_config_pipe[0] + 1, &rfds, NULL, NULL, &tv);
+ if (ret == -1) {
+ zlog(ZLOG_SYSERROR, "failed to select");
+ exit(FPM_EXIT_SOFTWARE);
+ }
+ if (ret) { /* data available */
+ int readval;
+ ret = read(fpm_globals.send_config_pipe[0], &readval, sizeof(readval));
+ if (ret == -1) {
+ zlog(ZLOG_SYSERROR, "failed to read from pipe");
+ exit(FPM_EXIT_SOFTWARE);
+ }
+
+ if (ret == 0) {
+ zlog(ZLOG_ERROR, "no data have been read from pipe");
+ exit(FPM_EXIT_SOFTWARE);
+ } else {
+ if (readval == 1) {
+ zlog(ZLOG_DEBUG, "I received a valid acknoledge from the master process, I can exit without error");
+ fpm_cleanups_run(FPM_CLEANUP_PARENT_EXIT);
+ exit(FPM_EXIT_OK);
+ } else {
+ zlog(ZLOG_DEBUG, "The master process returned an error !");
+ exit(FPM_EXIT_SOFTWARE);
+ }
+ }
+ } else { /* no date sent ! */
+ zlog(ZLOG_ERROR, "the master process didn't send back its status (via the pipe to the calling process)");
+ exit(FPM_EXIT_SOFTWARE);
+ }
exit(FPM_EXIT_SOFTWARE);
}
}
@@ -337,7 +350,7 @@ int fpm_unix_init_main() /* {{{ */
return -1;
}
} else {
- zlog(ZLOG_WARNING, "'process.priority' directive is ignored when FPM is not running as root");
+ zlog(ZLOG_NOTICE, "'process.priority' directive is ignored when FPM is not running as root");
}
}
diff --git a/sapi/fpm/init.d.php-fpm.in b/sapi/fpm/init.d.php-fpm.in
index dc66310c3d..49cce79ae9 100644
--- a/sapi/fpm/init.d.php-fpm.in
+++ b/sapi/fpm/init.d.php-fpm.in
@@ -18,7 +18,7 @@ php_fpm_CONF=@sysconfdir@/php-fpm.conf
php_fpm_PID=@localstatedir@/run/php-fpm.pid
-php_opts="--fpm-config $php_fpm_CONF"
+php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"
wait_for_pid () {
@@ -54,7 +54,7 @@ case "$1" in
start)
echo -n "Starting php-fpm "
- $php_fpm_BIN $php_opts
+ $php_fpm_BIN --daemonize $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in
index 6c9c6d6274..a4e7e74e20 100644
--- a/sapi/fpm/php-fpm.8.in
+++ b/sapi/fpm/php-fpm.8.in
@@ -99,6 +99,20 @@ Test FPM configuration file and exit
If called twice (-tt), the configuration is dumped before exiting.
.TP
.PD 0
+.B \-\-daemonize
+.TP
+.PD 1
+.B \-D
+Force to run in background and ignore daemonize option from configuration file.
+.TP
+.PD 0
+.B \-\-nodaemonize
+.TP
+.PD 1
+.B \-F
+Force to stay in foreground and ignore daemonize option from configuration file.
+.TP
+.PD 0
.B \-\-zend\-extension \fIfile\fP
.TP
.PD 1
@@ -113,13 +127,20 @@ The configuration file for the php-fpm daemon.
.B php.ini
The standard php configuration file.
.SH EXAMPLES
-You should use the init script provided to start and stop the php-fpm daemon. This situation applies for any unix systems which use init.d for their main process manager.
+For any unix systems which use init.d for their main process manager, you should use the init script provided to start and stop the php-fpm daemon.
.P
.PD 1
.RS
sudo /etc/init.d/php-fpm start
.RE
.TP
+For any unix systems which use systemd for their main process manager, you should use the unit file provided to start and stop the php-fpm daemon.
+.P
+.PD 1
+.RS
+sudo systemctl start php-fpm.service
+.RE
+.TP
If your installation has no appropriate init script, launch php-fpm with no arguments. It will launch as a daemon (background process) by default. The file @php_fpm_localstatedir@/run/php-fpm.pid determines whether php-fpm is already up and running. Once started, php-fpm then responds to several POSIX signals:
.P
.PD 0
diff --git a/sapi/fpm/php-fpm.service.in b/sapi/fpm/php-fpm.service.in
new file mode 100644
index 0000000000..396a88d66f
--- /dev/null
+++ b/sapi/fpm/php-fpm.service.in
@@ -0,0 +1,12 @@
+[Unit]
+Description=The PHP FastCGI Process Manager
+After=syslog.target network.target
+
+[Service]
+PIDFile=@localstatedir@/run/php-fpm.pid
+ExecStart=@sbindir@/php-fpm --nodaemonize --fpm-config @sysconfdir@/php-fpm.conf
+ExecReload=/bin/kill -USR2 $MAINPID
+
+[Install]
+WantedBy=multi-user.target
+