2017-03-04 22:57:14 -06:00
|
|
|
m4_define([jq_version],
|
|
|
|
m4_esyscmd_s([(git rev-parse --verify -q jq-1.0 > /dev/null &&
|
|
|
|
(git describe --tags --dirty --match 'jq-*'|sed 's/^jq-//')) ||
|
|
|
|
echo `git rev-parse --abbrev-ref HEAD`-`git describe --always --dirty`])))
|
2013-12-31 17:15:44 -06:00
|
|
|
|
2015-07-24 22:47:05 -07:00
|
|
|
AC_INIT([jq], [jq_version], [https://github.com/stedolan/jq/issues],
|
2015-08-15 12:07:00 -07:00
|
|
|
[jq], [https://stedolan.github.io/jq])
|
2012-11-27 16:02:59 -06:00
|
|
|
|
2014-08-04 23:54:30 -04:00
|
|
|
m4_include([m4/ax_compare_version.m4])
|
|
|
|
m4_include([m4/ax_prog_bison_version.m4])
|
|
|
|
|
2012-11-27 16:02:59 -06:00
|
|
|
dnl Created autoconf implementation thompson@dtosolutions, 26NOV12
|
2015-02-18 13:15:44 +01:00
|
|
|
AC_PREREQ([2.64])
|
2012-11-27 16:02:59 -06:00
|
|
|
AC_CONFIG_AUX_DIR([config])
|
2015-08-23 20:36:11 -07:00
|
|
|
AM_INIT_AUTOMAKE([1.11.2 subdir-objects parallel-tests foreign -Wall])
|
2013-02-03 00:09:47 -06:00
|
|
|
AM_SILENT_RULES([yes])
|
2014-01-25 18:55:58 +01:00
|
|
|
AM_PROG_AR
|
2015-02-15 17:57:53 -06:00
|
|
|
AM_MAINTAINER_MODE([enable])
|
2012-11-27 16:02:59 -06:00
|
|
|
AC_PROG_CC
|
|
|
|
AC_PROG_CC_STDC
|
|
|
|
AC_PROG_CPP_WERROR
|
2012-11-28 01:08:23 -06:00
|
|
|
AC_PROG_YACC
|
2013-06-16 08:25:12 -05:00
|
|
|
AC_OBJEXT
|
|
|
|
AC_EXEEXT
|
|
|
|
LT_INIT([shared static win32-dll])
|
2012-11-27 16:02:59 -06:00
|
|
|
AM_PROG_CC_C_O
|
|
|
|
|
2014-08-04 23:54:30 -04:00
|
|
|
|
2012-11-28 01:08:23 -06:00
|
|
|
dnl couldn't use AM_PROG_LEX as it doesn't support header files like the
|
|
|
|
dnl AC_PROG_YACC macros...
|
|
|
|
|
2014-01-01 23:10:00 -06:00
|
|
|
dnl check bison version
|
2014-08-04 23:54:30 -04:00
|
|
|
|
2015-02-15 17:57:53 -06:00
|
|
|
if test "$USE_MAINTAINER_MODE" = yes; then
|
|
|
|
if test "$YACC" != "bison -y"; then
|
|
|
|
AC_MSG_CHECKING([bison version])
|
|
|
|
AC_MSG_RESULT([not bison])
|
|
|
|
else
|
|
|
|
AX_PROG_BISON_VERSION([3],
|
|
|
|
[],
|
2015-02-17 10:59:27 -06:00
|
|
|
[AC_MSG_ERROR([You need bison version 3.0 or greater, or use --disable-maintainer-mode.])])
|
2015-02-15 17:57:53 -06:00
|
|
|
fi
|
|
|
|
|
2017-02-25 14:30:14 -06:00
|
|
|
AC_CHECK_PROGS(LEX, flex lex)
|
2013-05-09 11:31:17 +01:00
|
|
|
fi
|
|
|
|
|
2012-11-27 16:02:59 -06:00
|
|
|
dnl Check for valgrind
|
|
|
|
AC_CHECK_PROGS(valgrind_cmd, valgrind)
|
2013-05-09 15:22:38 +01:00
|
|
|
if test "x$valgrind_cmd" = "x" ; then
|
|
|
|
AC_MSG_WARN([valgrind is required to test jq.])
|
2012-11-27 16:02:59 -06:00
|
|
|
fi
|
2014-07-09 00:55:20 -04:00
|
|
|
AC_CHECK_FUNCS(memmem)
|
2015-01-01 03:14:55 -06:00
|
|
|
AC_CHECK_FUNCS(mkstemp)
|
2012-11-27 16:02:59 -06:00
|
|
|
|
2016-01-15 16:06:30 -06:00
|
|
|
AC_CHECK_HEADER("shlwapi.h",[have_win32=1;])
|
|
|
|
AM_CONDITIONAL([WIN32], [test "x$have_win32" = x1])
|
2013-05-09 15:22:38 +01:00
|
|
|
|
2015-06-27 09:52:12 -07:00
|
|
|
dnl Running tests with Valgrind is slow. It is faster to iterate on
|
|
|
|
dnl code without Valgrind until tests pass, then enable Valgrind and
|
|
|
|
dnl fix leaks.
|
|
|
|
AC_ARG_ENABLE([valgrind],
|
|
|
|
AC_HELP_STRING([--disable-valgrind], [do not run tests under Valgrind]))
|
|
|
|
|
2015-10-27 19:01:06 -05:00
|
|
|
dnl Running tests with Valgrind is slow; address sanitizer (ASAN) is
|
|
|
|
dnl faster.
|
|
|
|
AC_ARG_ENABLE([asan],
|
|
|
|
AC_HELP_STRING([--enable-asan], [enable address sanitizer]))
|
|
|
|
|
2016-01-17 12:09:43 -06:00
|
|
|
dnl Undefined Behavior Sanitizer
|
|
|
|
AC_ARG_ENABLE([ubsan],
|
|
|
|
AC_HELP_STRING([--enable-ubsan], [enable undefined behavior sanitizer]))
|
|
|
|
|
2015-06-27 10:16:13 -07:00
|
|
|
dnl Code coverage
|
|
|
|
AC_ARG_ENABLE([gcov],
|
|
|
|
AC_HELP_STRING([--enable-gcov], [enable gcov code coverage tool]))
|
|
|
|
|
2019-02-20 20:50:08 -05:00
|
|
|
dnl Don't attempt to build docs if python deps aren't installed
|
2013-05-09 20:27:12 +01:00
|
|
|
AC_ARG_ENABLE([docs],
|
2013-05-09 15:22:38 +01:00
|
|
|
AC_HELP_STRING([--disable-docs], [don't build docs]))
|
|
|
|
|
2015-05-03 19:23:37 -05:00
|
|
|
dnl Don't attempt to build the error injection object (if there is no LD_PRELOAD support)
|
|
|
|
AC_ARG_ENABLE([error-injection],
|
|
|
|
AC_HELP_STRING([--enable-error-injection], [build and test with error injection]))
|
|
|
|
|
2015-05-25 21:19:56 -05:00
|
|
|
dnl Enable building all static
|
|
|
|
AC_ARG_ENABLE([all-static],
|
|
|
|
AC_HELP_STRING([--enable-all-static], [link jq with static libraries only]))
|
|
|
|
|
2019-03-06 13:58:09 -06:00
|
|
|
AS_IF([test "x$enable_docs" = "xyes"],[
|
2019-02-20 20:50:08 -05:00
|
|
|
AC_CHECK_PROGS(pipenv_cmd, pipenv)
|
2013-06-05 16:40:01 +01:00
|
|
|
|
2019-02-20 20:50:08 -05:00
|
|
|
AC_CACHE_CHECK([for Python dependencies], [jq_cv_python_deps],
|
|
|
|
[jq_cv_python_deps=yes;
|
|
|
|
AS_IF([test "x$pipenv_cmd" = "x" || \
|
|
|
|
! bmsg="`cd ${srcdir}/docs; LC_ALL=$LANG "$pipenv_cmd" check`"],[
|
|
|
|
AC_MSG_ERROR([$bmsg])
|
2013-06-05 16:40:01 +01:00
|
|
|
cat <<EOF
|
2013-05-09 20:27:12 +01:00
|
|
|
*****************************************************************
|
2019-02-20 20:50:08 -05:00
|
|
|
* Python dependencies for building jq documentation not found. *
|
2013-05-09 20:27:12 +01:00
|
|
|
* You can still build, install and hack on jq, but the manpage *
|
2015-10-27 19:01:06 -05:00
|
|
|
* will not be rebuilt and some of the tests will not run. *
|
2013-05-09 20:27:12 +01:00
|
|
|
* See docs/README.md for how to install the docs dependencies. *
|
|
|
|
*****************************************************************
|
|
|
|
EOF
|
2019-02-20 20:50:08 -05:00
|
|
|
jq_cv_python_deps=no
|
2013-06-05 16:40:01 +01:00
|
|
|
])])
|
|
|
|
|
2019-02-20 20:50:08 -05:00
|
|
|
if test "x$jq_cv_python_deps" != "xyes"; then
|
2013-06-05 16:40:01 +01:00
|
|
|
enable_docs=no
|
|
|
|
fi
|
2013-05-09 15:22:38 +01:00
|
|
|
])
|
|
|
|
|
2015-06-27 09:52:12 -07:00
|
|
|
AM_CONDITIONAL([ENABLE_VALGRIND], [test "x$enable_valgrind" != xno])
|
2015-10-27 19:01:06 -05:00
|
|
|
AM_CONDITIONAL([ENABLE_ASAN], [test "x$enable_asan" = xyes])
|
2016-01-17 12:09:43 -06:00
|
|
|
AM_CONDITIONAL([ENABLE_UBSAN], [test "x$enable_ubsan" = xyes])
|
2015-06-27 10:16:13 -07:00
|
|
|
AM_CONDITIONAL([ENABLE_GCOV], [test "x$enable_gcov" = xyes])
|
2013-05-09 15:22:38 +01:00
|
|
|
AM_CONDITIONAL([ENABLE_DOCS], [test "x$enable_docs" != xno])
|
2015-05-03 19:23:37 -05:00
|
|
|
AM_CONDITIONAL([ENABLE_ERROR_INJECTION], [test "x$enable_error_injection" = xyes])
|
2015-05-25 21:19:56 -05:00
|
|
|
AM_CONDITIONAL([ENABLE_ALL_STATIC], [test "x$enable_all_static" = xyes])
|
2014-04-16 18:42:36 -05:00
|
|
|
|
2015-06-18 11:07:16 -07:00
|
|
|
AC_FUNC_ALLOCA
|
|
|
|
|
2014-06-16 21:28:30 -05:00
|
|
|
AC_FIND_FUNC([isatty], [c], [#include <unistd.h>], [0])
|
|
|
|
AC_FIND_FUNC([_isatty], [c], [#include <io.h>], [0])
|
2015-03-08 18:56:51 -05:00
|
|
|
AC_FIND_FUNC([strptime], [c], [#include <time.h>], [0, 0, 0])
|
|
|
|
AC_FIND_FUNC([strftime], [c], [#include <time.h>], [0, 0, 0, 0])
|
2018-12-18 16:49:32 +08:00
|
|
|
AC_FIND_FUNC([setenv], [c], [#include <stdlib.h>], [0, 0, 0])
|
2015-03-08 18:56:51 -05:00
|
|
|
AC_FIND_FUNC([timegm], [c], [#include <time.h>], [0])
|
|
|
|
AC_FIND_FUNC([gmtime_r], [c], [#include <time.h>], [0, 0])
|
|
|
|
AC_FIND_FUNC([gmtime], [c], [#include <time.h>], [0])
|
2017-02-23 22:26:53 -06:00
|
|
|
AC_FIND_FUNC([localtime_r], [c], [#include <time.h>], [0, 0])
|
|
|
|
AC_FIND_FUNC([localtime], [c], [#include <time.h>], [0])
|
2015-03-08 18:56:51 -05:00
|
|
|
AC_FIND_FUNC([gettimeofday], [c], [#include <time.h>], [0, 0])
|
|
|
|
AC_CHECK_MEMBER([struct tm.tm_gmtoff], [AC_DEFINE([HAVE_TM_TM_GMT_OFF],1,[Define to 1 if the system has the tm_gmt_off field in struct tm])],
|
|
|
|
[], [[#include <time.h>]])
|
|
|
|
AC_CHECK_MEMBER([struct tm.__tm_gmtoff], [AC_DEFINE([HAVE_TM___TM_GMT_OFF],1,[Define to 1 if the system has the __tm_gmt_off field in struct tm])],
|
|
|
|
[], [[#include <time.h>]])
|
2014-06-16 21:28:30 -05:00
|
|
|
|
2014-04-17 20:17:06 -05:00
|
|
|
AC_ARG_ENABLE([pthread-tls],
|
|
|
|
[AC_HELP_STRING([--enable-pthread-tls],
|
|
|
|
[Enable use of pthread thread local storage])],
|
|
|
|
[],
|
|
|
|
[enable_pthread_tls=no])
|
|
|
|
|
|
|
|
if test $enable_pthread_tls = yes; then
|
|
|
|
AC_FIND_FUNC([pthread_key_create], [pthread], [#include <pthread.h>], [NULL, NULL])
|
|
|
|
AC_FIND_FUNC([pthread_once], [pthread], [#include <pthread.h>], [NULL, NULL])
|
|
|
|
AC_FIND_FUNC([atexit], [pthread], [#include <stdlib.h>], [NULL])
|
|
|
|
fi
|
2014-04-16 18:42:36 -05:00
|
|
|
|
2015-06-27 23:14:46 -05:00
|
|
|
dnl libm math.h functions
|
Bugfix: Math function checking
We had config machinery that determined which math functions are
available in libc. If a c math function was missing on the host system,
then the corresponding jq function would be removed from the source,
enabling the build to proceed anyway. The detection machinery was broken
in a subtle way, as was shown after glibc updated to 2.27, dropping the
`pow10` function. This caused compilation to fail.
The essential problem was that we detected whether a math function was
available by compiling and linking a small program evaluating that
function on constants. However, since gcc's optimization machinery has
special knowledge of some math functions (e.g. `pow10`), it can
optimize them away, even if they don't exist in the library and are not
linkable. That is, the following example compiles and links against
glibc 2.27, even though `pow10` has been removed:
```
int main () {
printf("%f", pow10(0.5));
return 0;
}
```
What?!
On the other hand, this program does not link:
```
int main () {
double f;
printf("%f", &f);
printf("%f", pow10(f));
return 0;
}
```
In the first program the call to `pow10` can be optimized away as a
constant expression. This requires GCC to know about `pow10` (which it
does!), but it does not require `pow10` to be in the library (and
actually linkable).
The solution is to use autoconf's machinery for detecting function
presence, instead of our own (buggy) machinery. This has the added
benefit of simplifying the code.
The bug was reported in issue #1659
2018-08-02 00:25:07 -07:00
|
|
|
AC_CHECK_MATH_FUNC(acos)
|
|
|
|
AC_CHECK_MATH_FUNC(acosh)
|
|
|
|
AC_CHECK_MATH_FUNC(asin)
|
|
|
|
AC_CHECK_MATH_FUNC(asinh)
|
|
|
|
AC_CHECK_MATH_FUNC(atan2)
|
|
|
|
AC_CHECK_MATH_FUNC(atan)
|
|
|
|
AC_CHECK_MATH_FUNC(atanh)
|
|
|
|
AC_CHECK_MATH_FUNC(cbrt)
|
|
|
|
AC_CHECK_MATH_FUNC(ceil)
|
|
|
|
AC_CHECK_MATH_FUNC(copysign)
|
|
|
|
AC_CHECK_MATH_FUNC(cos)
|
|
|
|
AC_CHECK_MATH_FUNC(cosh)
|
|
|
|
AC_CHECK_MATH_FUNC(drem)
|
|
|
|
AC_CHECK_MATH_FUNC(erf)
|
|
|
|
AC_CHECK_MATH_FUNC(erfc)
|
|
|
|
AC_CHECK_MATH_FUNC(exp10)
|
|
|
|
AC_CHECK_MATH_FUNC(exp2)
|
|
|
|
AC_CHECK_MATH_FUNC(exp)
|
|
|
|
AC_CHECK_MATH_FUNC(expm1)
|
|
|
|
AC_CHECK_MATH_FUNC(fabs)
|
|
|
|
AC_CHECK_MATH_FUNC(fdim)
|
|
|
|
AC_CHECK_MATH_FUNC(floor)
|
|
|
|
AC_CHECK_MATH_FUNC(fma)
|
|
|
|
AC_CHECK_MATH_FUNC(fmax)
|
|
|
|
AC_CHECK_MATH_FUNC(fmin)
|
|
|
|
AC_CHECK_MATH_FUNC(fmod)
|
|
|
|
AC_CHECK_MATH_FUNC(frexp)
|
|
|
|
AC_CHECK_MATH_FUNC(gamma)
|
|
|
|
AC_CHECK_MATH_FUNC(hypot)
|
|
|
|
AC_CHECK_MATH_FUNC(j0)
|
|
|
|
AC_CHECK_MATH_FUNC(j1)
|
|
|
|
AC_CHECK_MATH_FUNC(jn)
|
|
|
|
AC_CHECK_MATH_FUNC(ldexp)
|
|
|
|
AC_CHECK_MATH_FUNC(lgamma)
|
|
|
|
AC_CHECK_MATH_FUNC(log10)
|
|
|
|
AC_CHECK_MATH_FUNC(log1p)
|
|
|
|
AC_CHECK_MATH_FUNC(log2)
|
|
|
|
AC_CHECK_MATH_FUNC(log)
|
|
|
|
AC_CHECK_MATH_FUNC(logb)
|
|
|
|
AC_CHECK_MATH_FUNC(modf)
|
|
|
|
AC_CHECK_MATH_FUNC(lgamma_r)
|
|
|
|
AC_CHECK_MATH_FUNC(nearbyint)
|
|
|
|
AC_CHECK_MATH_FUNC(nextafter)
|
|
|
|
AC_CHECK_MATH_FUNC(nexttoward)
|
|
|
|
AC_CHECK_MATH_FUNC(pow10) # Not available with glibc version >= 2.27
|
|
|
|
AC_CHECK_MATH_FUNC(pow)
|
|
|
|
AC_CHECK_MATH_FUNC(remainder)
|
|
|
|
AC_CHECK_MATH_FUNC(rint)
|
|
|
|
AC_CHECK_MATH_FUNC(round)
|
|
|
|
AC_CHECK_MATH_FUNC(scalb)
|
|
|
|
AC_CHECK_MATH_FUNC(scalbln)
|
|
|
|
AC_CHECK_MATH_FUNC(significand)
|
|
|
|
AC_CHECK_MATH_FUNC(sin)
|
|
|
|
AC_CHECK_MATH_FUNC(sinh)
|
|
|
|
AC_CHECK_MATH_FUNC(sqrt)
|
|
|
|
AC_CHECK_MATH_FUNC(tan)
|
|
|
|
AC_CHECK_MATH_FUNC(tanh)
|
|
|
|
AC_CHECK_MATH_FUNC(tgamma)
|
|
|
|
AC_CHECK_MATH_FUNC(trunc)
|
|
|
|
AC_CHECK_MATH_FUNC(y0)
|
|
|
|
AC_CHECK_MATH_FUNC(y1)
|
|
|
|
AC_CHECK_MATH_FUNC(yn)
|
2015-06-27 23:14:46 -05:00
|
|
|
|
2014-04-16 18:42:36 -05:00
|
|
|
dnl Thread local storage
|
|
|
|
have___thread=no
|
|
|
|
AC_MSG_CHECKING(for thread-local storage)
|
|
|
|
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
|
|
|
static __thread int x ;
|
|
|
|
int main () { x = 123; return x; }
|
|
|
|
])], have___thread=yes)
|
2015-08-13 22:33:37 -07:00
|
|
|
if test $have___thread = yes; then
|
2014-04-16 18:42:36 -05:00
|
|
|
AC_DEFINE([HAVE___THREAD],1,[Define to 1 if the system supports __thread])
|
|
|
|
fi
|
|
|
|
AC_MSG_RESULT($have___thread)
|
|
|
|
|
2014-06-11 10:37:32 +02:00
|
|
|
AC_C_BIGENDIAN(
|
|
|
|
AC_DEFINE([IEEE_MC68k], 1, [machine is bigendian]),
|
|
|
|
AC_DEFINE([IEEE_8087], 1, [machine is littleendian]),
|
|
|
|
AC_MSG_ERROR(unknown endianess),
|
|
|
|
AC_MSG_ERROR(universial endianess not supported)
|
|
|
|
)
|
2014-04-16 18:42:36 -05:00
|
|
|
|
2017-01-26 23:29:00 -05:00
|
|
|
dnl Oniguruma
|
|
|
|
AC_ARG_WITH([oniguruma],
|
|
|
|
[AS_HELP_STRING([--with-oniguruma=prefix],
|
|
|
|
[try this for a non-standard install prefix of the oniguruma library])], ,
|
|
|
|
[with_oniguruma=yes])
|
|
|
|
|
2017-02-25 21:49:38 -06:00
|
|
|
onig_CFLAGS=
|
|
|
|
onig_LDFLAGS=
|
2017-01-26 23:29:00 -05:00
|
|
|
build_oniguruma=no
|
|
|
|
AS_IF([test "x$with_oniguruma" != xno], [
|
|
|
|
save_CFLAGS="$CFLAGS"
|
|
|
|
save_LDFLAGS="$LDFLAGS"
|
|
|
|
AS_IF([test "x$with_oniguruma" != xyes], [
|
2017-02-23 00:30:13 -06:00
|
|
|
AS_IF([test "x$with_oniguruma" = xbuiltin], [
|
|
|
|
build_oniguruma=yes
|
|
|
|
], [
|
|
|
|
onig_CFLAGS="-I${with_oniguruma}/include"
|
|
|
|
onig_LDFLAGS="-L${with_oniguruma}/lib"
|
|
|
|
])
|
2017-01-26 23:29:00 -05:00
|
|
|
])
|
2017-02-23 00:30:13 -06:00
|
|
|
AS_IF([test "x$build_oniguruma" = xno], [
|
2017-02-25 21:49:38 -06:00
|
|
|
# check for ONIGURUMA library, either in /usr or where requested
|
|
|
|
CFLAGS="$CFLAGS $onig_CFLAGS"
|
|
|
|
LDFLAGS="$LDFLAGS $onig_LDFLAGS"
|
2017-02-23 00:30:13 -06:00
|
|
|
AC_CHECK_HEADER("oniguruma.h",
|
|
|
|
AC_CHECK_LIB([onig],[onig_version]))
|
|
|
|
# handle check results
|
|
|
|
AS_IF([test "x$ac_cv_lib_onig_onig_version" != "xyes"], [
|
|
|
|
build_oniguruma=yes
|
|
|
|
AC_MSG_NOTICE([Oniguruma was not found. Will use the packaged oniguruma.])
|
|
|
|
])
|
|
|
|
])
|
2017-02-26 18:22:23 -06:00
|
|
|
AS_IF([test "x$build_oniguruma" = xyes -a -f "${srcdir}/modules/oniguruma/configure.ac" ], [
|
2017-02-23 00:30:13 -06:00
|
|
|
onig_CFLAGS="-I${srcdir}/modules/oniguruma/src"
|
2017-02-25 14:02:03 -06:00
|
|
|
onig_LDFLAGS="-L${srcdir}/modules/oniguruma/src -Wl,-rpath,${libdir}"
|
2017-02-23 00:30:13 -06:00
|
|
|
AC_CONFIG_SUBDIRS([modules/oniguruma])
|
2017-02-25 14:02:03 -06:00
|
|
|
AC_DEFINE([HAVE_LIBONIG],1,[Define to 1 if the system includes libonig])
|
2017-01-26 23:29:00 -05:00
|
|
|
])
|
2017-02-25 21:49:38 -06:00
|
|
|
CFLAGS="$save_CFLAGS"
|
|
|
|
LDFLAGS="$save_LDFLAGS"
|
2017-01-26 23:29:00 -05:00
|
|
|
])
|
2017-02-25 21:49:38 -06:00
|
|
|
AC_SUBST(onig_CFLAGS)
|
|
|
|
AC_SUBST(onig_LDFLAGS)
|
2017-01-26 23:29:00 -05:00
|
|
|
|
|
|
|
AM_CONDITIONAL([BUILD_ONIGURUMA], [test "x$build_oniguruma" = xyes])
|
2013-05-09 20:27:12 +01:00
|
|
|
AC_SUBST([BUNDLER], ["$bundle_cmd"])
|
2013-05-09 15:22:38 +01:00
|
|
|
|
2013-06-23 11:47:42 +01:00
|
|
|
AC_CONFIG_MACRO_DIR([config/m4])
|
2012-11-27 16:02:59 -06:00
|
|
|
AC_CONFIG_FILES([Makefile])
|
|
|
|
AC_OUTPUT
|
2013-05-08 02:30:08 +01:00
|
|
|
|